Merge branch 'v5-develop' of https://github.com/turbo124/invoiceninja into v5-develop

This commit is contained in:
David Bomba 2024-06-01 10:50:21 +10:00
commit 97d84795b5
29 changed files with 1749 additions and 1060 deletions

View File

@ -35,7 +35,7 @@ class NordigenController extends BaseController
/** @var array $context */ /** @var array $context */
$context = $request->getTokenContent(); $context = $request->getTokenContent();
$company = $request->getCompany(); $company = $request->getCompany();
$lang = $company->locale(); $lang = substr($company->locale(), 0, 2);
$context["lang"] = $lang; $context["lang"] = $lang;
if (!$context) { if (!$context) {
@ -143,7 +143,7 @@ class NordigenController extends BaseController
$data = $request->all(); $data = $request->all();
$company = $request->getCompany(); $company = $request->getCompany();
$account = $company->account; $account = $company->account;
$lang = $company->locale(); $lang = substr($company->locale(), 0, 2);
/** @var array $context */ /** @var array $context */
$context = $request->getTokenContent(); $context = $request->getTokenContent();

View File

@ -29,6 +29,7 @@ use App\Utils\HostedPDF\NinjaPdf;
use App\Utils\HtmlEngine; use App\Utils\HtmlEngine;
use App\Utils\Ninja; use App\Utils\Ninja;
use App\Utils\PhantomJS\Phantom; use App\Utils\PhantomJS\Phantom;
use App\Utils\Traits\GeneratesCounter;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
use App\Utils\Traits\MakesInvoiceHtml; use App\Utils\Traits\MakesInvoiceHtml;
use App\Utils\Traits\Pdf\PageNumbering; use App\Utils\Traits\Pdf\PageNumbering;
@ -40,6 +41,7 @@ use Twig\Error\SyntaxError;
class PreviewController extends BaseController class PreviewController extends BaseController
{ {
use GeneratesCounter;
use MakesHash; use MakesHash;
use MakesInvoiceHtml; use MakesInvoiceHtml;
use PageNumbering; use PageNumbering;
@ -404,23 +406,24 @@ class PreviewController extends BaseController
/** @var \App\Models\Client $client */ /** @var \App\Models\Client $client */
$client = Client::factory()->create([ $client = Client::factory()->create([
'user_id' => auth()->user()->id, 'user_id' => $user->id,
'company_id' => $company->id, 'company_id' => $company->id,
]); ]);
/** @var \App\Models\ClientContact $contact */ /** @var \App\Models\ClientContact $contact */
$contact = ClientContact::factory()->create([ $contact = ClientContact::factory()->create([
'user_id' => auth()->user()->id, 'user_id' => $user->id,
'company_id' => $company->id, 'company_id' => $company->id,
'client_id' => $client->id, 'client_id' => $client->id,
'is_primary' => 1, 'is_primary' => 1,
'send_email' => true, 'send_email' => true,
]); ]);
/** @var \App\Models\Invoice $invoice */ $settings = $company->settings;
/** @var \App\Models\Invoice $invoice */
$invoice = Invoice::factory()->create([ $invoice = Invoice::factory()->create([
'user_id' => auth()->user()->id, 'user_id' => $user->id,
'company_id' => $company->id, 'company_id' => $company->id,
'client_id' => $client->id, 'client_id' => $client->id,
'terms' => $company->settings->invoice_terms, 'terms' => $company->settings->invoice_terms,
@ -428,8 +431,18 @@ class PreviewController extends BaseController
'public_notes' => 'Sample Public Notes', 'public_notes' => 'Sample Public Notes',
]); ]);
if ($settings->invoice_number_pattern) {
$invoice->number = $this->getFormattedEntityNumber(
$invoice,
rand(1, 9999),
$settings->counter_padding ?: 4,
$settings->invoice_number_pattern,
);
$invoice->save();
}
$invitation = InvoiceInvitation::factory()->create([ $invitation = InvoiceInvitation::factory()->create([
'user_id' => auth()->user()->id, 'user_id' => $user->id,
'company_id' => $company->id, 'company_id' => $company->id,
'invoice_id' => $invoice->id, 'invoice_id' => $invoice->id,
'client_contact_id' => $contact->id, 'client_contact_id' => $contact->id,
@ -454,7 +467,7 @@ class PreviewController extends BaseController
'template' => $design->elements([ 'template' => $design->elements([
'client' => $invoice->client, 'client' => $invoice->client,
'entity' => $invoice, 'entity' => $invoice,
'pdf_variables' => (array) $invoice->company->settings->pdf_variables, 'pdf_variables' => (array) $settings->pdf_variables,
'products' => request()->design['design']['product'], 'products' => request()->design['design']['product'],
]), ]),
'variables' => $html->generateLabelsAndValues(), 'variables' => $html->generateLabelsAndValues(),

View File

@ -70,12 +70,10 @@ class StartupCheck
private function buildTemplates($name = 'templates') private function buildTemplates($name = 'templates')
{ {
$data = [ $data = [
'invoice' => [ 'invoice' => [
'subject' => EmailTemplateDefaults::emailInvoiceSubject(), 'subject' => EmailTemplateDefaults::emailInvoiceSubject(),
'body' => EmailTemplateDefaults::emailInvoiceTemplate(), 'body' => EmailTemplateDefaults::emailInvoiceTemplate(),
], ],
'quote' => [ 'quote' => [
'subject' => EmailTemplateDefaults::emailQuoteSubject(), 'subject' => EmailTemplateDefaults::emailQuoteSubject(),
'body' => EmailTemplateDefaults::emailQuoteTemplate(), 'body' => EmailTemplateDefaults::emailQuoteTemplate(),

View File

@ -20,6 +20,10 @@ use App\Utils\Traits\MakesHash;
use App\PaymentDrivers\Common\MethodInterface; use App\PaymentDrivers\Common\MethodInterface;
use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest;
use App\Exceptions\PaymentFailed; use App\Exceptions\PaymentFailed;
use Illuminate\Mail\Mailables\Address;
use App\Services\Email\EmailObject;
use App\Services\Email\Email;
use Illuminate\Support\Facades\App;
class BTCPay implements MethodInterface class BTCPay implements MethodInterface
{ {
@ -128,18 +132,55 @@ class BTCPay implements MethodInterface
public function refund(Payment $payment, $amount) public function refund(Payment $payment, $amount)
{ {
try { try {
$invoice = $payment->invoices()->first(); if ($amount == $payment->amount) {
$isPartialRefund = ($amount < $payment->amount); $refundVariant = "Fiat";
$refundPaymentMethod = "BTC";
$refundDescription = "Full refund";
$refundCustomCurrency = null;
$refundCustomAmount = null;
} else {
$refundVariant = "Custom";
$refundPaymentMethod = "";
$refundDescription = "Partial refund";
$refundCustomCurrency = $payment->currency;
$refundCustomAmount = $amount;
}
$client = new \BTCPayServer\Client\Invoice($this->driver_class->btcpay_url, $this->driver_class->api_key); $client = new \BTCPayServer\Client\Invoice($this->driver_class->btcpay_url, $this->driver_class->api_key);
$refund = $client->refundInvoice($this->driver_class->store_id, $payment->transaction_reference); $refund = $client->refundInvoice(
$this->driver_class->store_id,
$payment->transaction_reference,
$refundVariant,
$refundPaymentMethod,
null,
$refundDescription,
0,
$refundCustomAmount,
$refundCustomCurrency
);
App::setLocale($payment->company->getLocale());
/* $data = []; $mo = new EmailObject();
$data['InvoiceNumber'] = $invoice->number; $mo->subject = ctrans('texts.btcpay_refund_subject');
$data['isPartialRefund'] = $isPartialRefund; $mo->body = ctrans('texts.btcpay_refund_body') . '<br>' . $refund->getViewLink();
$data['BTCPayLink'] = $refund->getViewLink();*/ $mo->text_body = ctrans('texts.btcpay_refund_body') . '\n' . $refund->getViewLink();
$mo->company_key = $payment->company->company_key;
$mo->html_template = 'email.template.generic';
$mo->to = [new Address($payment->client->present()->email(), $payment->client->present()->name())];
$mo->email_template_body = 'btcpay_refund_subject';
$mo->email_template_subject = 'btcpay_refund_body';
return $refund->getViewLink(); Email::dispatch($mo, $payment->company);
$data = [
'transaction_reference' => $refund->getId(),
'transaction_response' => json_encode($refund),
'success' => true,
'description' => "Please follow this link to claim your refund: " . $refund->getViewLink(),
'code' => 202,
];
return $data;
} catch (\Throwable $e) { } catch (\Throwable $e) {
throw new PaymentFailed('Error during BTCPay refund : ' . $e->getMessage()); throw new PaymentFailed('Error during BTCPay refund : ' . $e->getMessage());
} }

View File

@ -79,10 +79,14 @@ class BTCPayPaymentDriver extends BaseDriver
return $this->payment_method->paymentView($data); //this is your custom implementation from here return $this->payment_method->paymentView($data); //this is your custom implementation from here
} }
public function processPaymentResponse($request)
{
return $this->payment_method->paymentResponse($request);
}
public function processWebhookRequest() public function processWebhookRequest()
{ {
$webhook_payload = file_get_contents('php://input'); $webhook_payload = file_get_contents('php://input');
//file_put_contents("/home/claude/invoiceninja/storage/my.log", $webhook_payload);
$btcpayRep = json_decode($webhook_payload); $btcpayRep = json_decode($webhook_payload);
if ($btcpayRep == null) { if ($btcpayRep == null) {

View File

@ -0,0 +1,100 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2024. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Providers;
use App\Models\Bank;
use App\Models\Country;
use App\Models\Currency;
use App\Models\Industry;
use App\Models\Language;
use App\Models\PaymentTerm;
use Illuminate\Support\ServiceProvider;
use App\DataMapper\EmailTemplateDefaults;
class StaticServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
app()->singleton('currencies', function ($app) {
return Currency::query()->orderBy('name')->get();
});
app()->singleton('languages', function ($app) {
return Language::query()->orderBy('name')->get();
});
app()->singleton('countries', function ($app) {
return Country::query()->orderBy('name')->get();
});
app()->singleton('payment_types', function ($app) {
return PaymentTerm::query()->orderBy('num_days')->get();
});
app()->singleton('industries', function ($app) {
return Industry::query()->orderBy('name')->get();
});
app()->singleton('banks', function ($app){
return Bank::query()->orderBy('name')->get();
});
app()->singleton('templates', function ($app){
return [
'invoice' => [
'subject' => EmailTemplateDefaults::emailInvoiceSubject(),
'body' => EmailTemplateDefaults::emailInvoiceTemplate(),
],
'quote' => [
'subject' => EmailTemplateDefaults::emailQuoteSubject(),
'body' => EmailTemplateDefaults::emailQuoteTemplate(),
],
'payment' => [
'subject' => EmailTemplateDefaults::emailPaymentSubject(),
'body' => EmailTemplateDefaults::emailPaymentTemplate(),
],
'reminder1' => [
'subject' => EmailTemplateDefaults::emailReminder1Subject(),
'body' => EmailTemplateDefaults::emailReminder1Template(),
],
'reminder2' => [
'subject' => EmailTemplateDefaults::emailReminder2Subject(),
'body' => EmailTemplateDefaults::emailReminder2Template(),
],
'reminder3' => [
'subject' => EmailTemplateDefaults::emailReminder3Subject(),
'body' => EmailTemplateDefaults::emailReminder3Template(),
],
'reminder_endless' => [
'subject' => EmailTemplateDefaults::emailReminderEndlessSubject(),
'body' => EmailTemplateDefaults::emailReminderEndlessTemplate(),
],
'statement' => [
'subject' => EmailTemplateDefaults::emailStatementSubject(),
'body' => EmailTemplateDefaults::emailStatementTemplate(),
],
];
});
}
public function boot()
{
}
}

View File

@ -27,11 +27,13 @@ use App\Models\PurchaseOrderInvitation;
use App\Models\Quote; use App\Models\Quote;
use App\Models\QuoteInvitation; use App\Models\QuoteInvitation;
use App\Models\Vendor; use App\Models\Vendor;
use App\Utils\Traits\GeneratesCounter;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
class PdfMock class PdfMock
{ {
use MakesHash; use MakesHash;
use GeneratesCounter;
private mixed $mock; private mixed $mock;
@ -206,6 +208,20 @@ class PdfMock
*/ */
public function getStubVariables(): array public function getStubVariables(): array
{ {
$entity_pattern = $this->entity_string.'_number_pattern';
$entity_number = '0029';
if (!empty($this->settings->{$entity_pattern})) {
// Although $this->mock is the Invoice/etc entity,
// we need the invitation to get company details.
$entity_number = $this->getFormattedEntityNumber(
$this->mock->invitation,
(int) $entity_number,
$this->settings->counter_padding,
$this->settings->{$entity_pattern},
);
}
return ['values' => return ['values' =>
[ [
'$client.shipping_postal_code' => '46420', '$client.shipping_postal_code' => '46420',
@ -325,7 +341,7 @@ class PdfMock
'$client.currency' => 'USD', '$client.currency' => 'USD',
'$company.country' => $this->company->country()?->name ?? 'USA', '$company.country' => $this->company->country()?->name ?? 'USA',
'$company.address' => $this->company->present()->address(), '$company.address' => $this->company->present()->address(),
'$tech_hero_image' => 'http://ninja.test:8000/images/pdf-designs/tech-hero-image.jpg', '$tech_hero_image' => 'https://invoicing.co/images/pdf-designs/tech-hero-image.jpg',
'$task.tax_name1' => '', '$task.tax_name1' => '',
'$task.tax_name2' => '', '$task.tax_name2' => '',
'$task.tax_name3' => '', '$task.tax_name3' => '',
@ -370,7 +386,7 @@ class PdfMock
'$company.phone' => $this->settings->phone, '$company.phone' => $this->settings->phone,
'$company.state' => $this->settings->state, '$company.state' => $this->settings->state,
'$credit.number' => '0029', '$credit.number' => '0029',
'$entity_number' => '0029', '$entity_number' => $entity_number,
'$credit_number' => '0029', '$credit_number' => '0029',
'$global_margin' => '6.35mm', '$global_margin' => '6.35mm',
'$contact.phone' => '681-480-9828', '$contact.phone' => '681-480-9828',

View File

@ -288,7 +288,6 @@ trait GeneratesCounter
*/ */
public function getNextProjectNumber(Project $project): string public function getNextProjectNumber(Project $project): string
{ {
$entity_number = $this->getNextEntityNumber(Project::class, $project->client, false); $entity_number = $this->getNextEntityNumber(Project::class, $project->client, false);
return $this->replaceUserVars($project, $entity_number); return $this->replaceUserVars($project, $entity_number);
@ -412,7 +411,7 @@ trait GeneratesCounter
* *
* @param string $pattern * @param string $pattern
* @param string $prefix * @param string $prefix
* @return string The padded and prefixed entity number * @return string The padded, prefixed and unique entity number
*/ */
private function checkEntityNumber($class, $entity, $counter, $padding, $pattern, $prefix = ''): string private function checkEntityNumber($class, $entity, $counter, $padding, $pattern, $prefix = ''): string
{ {
@ -420,11 +419,7 @@ trait GeneratesCounter
$check_counter = 1; $check_counter = 1;
do { do {
$number = $this->padCounter($counter, $padding); $number = $this->getFormattedEntityNumber($entity, $counter, $padding, $pattern);
$number = $this->applyNumberPattern($entity, $number, $pattern);
$number = $this->prefixCounter($number, $prefix);
$check = $class::where('company_id', $entity->company_id)->where('number', $number)->withTrashed()->exists(); $check = $class::where('company_id', $entity->company_id)->where('number', $number)->withTrashed()->exists();
@ -443,6 +438,26 @@ trait GeneratesCounter
return $number; return $number;
} }
/**
* Formats the entity number according to pattern, prefix and padding.
*
* @param Collection $entity The entity ie App\Models\Client, Invoice, Quote etc
* @param int $counter The counter
* @param int $padding The padding
* @param string $pattern
* @param string $prefix
*
* @return string The padded and prefixed entity number
*/
public function getFormattedEntityNumber($entity, $counter, $padding, $pattern, $prefix = ''): string
{
$number = $this->padCounter($counter, $padding);
$number = $this->applyNumberPattern($entity, $number, $pattern);
return $this->prefixCounter($number, $prefix);
}
/*Check if a number is available for use. */ /*Check if a number is available for use. */
public function checkNumberAvailable($class, $entity, $number): bool public function checkNumberAvailable($class, $entity, $number): bool
{ {

231
composer.lock generated
View File

@ -9989,16 +9989,16 @@
}, },
{ {
"name": "phpstan/phpdoc-parser", "name": "phpstan/phpdoc-parser",
"version": "1.29.0", "version": "1.29.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git", "url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc" "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/536889f2b340489d328f5ffb7b02bb6b183ddedc", "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4",
"reference": "536889f2b340489d328f5ffb7b02bb6b183ddedc", "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -10030,9 +10030,9 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types", "description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": { "support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues", "issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.0" "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1"
}, },
"time": "2024-05-06T12:04:23+00:00" "time": "2024-05-31T08:52:43+00:00"
}, },
{ {
"name": "pragmarx/google2fa", "name": "pragmarx/google2fa",
@ -12517,16 +12517,16 @@
}, },
{ {
"name": "symfony/css-selector", "name": "symfony/css-selector",
"version": "v7.0.7", "version": "v7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/css-selector.git", "url": "https://github.com/symfony/css-selector.git",
"reference": "b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc" "reference": "843f2f7ac5e4c5bf0ec77daef23ca6d4d8922adc"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/css-selector/zipball/b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc", "url": "https://api.github.com/repos/symfony/css-selector/zipball/843f2f7ac5e4c5bf0ec77daef23ca6d4d8922adc",
"reference": "b08a4ad89e84b29cec285b7b1f781a7ae51cf4bc", "reference": "843f2f7ac5e4c5bf0ec77daef23ca6d4d8922adc",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -12562,7 +12562,7 @@
"description": "Converts CSS selectors to XPath expressions", "description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/css-selector/tree/v7.0.7" "source": "https://github.com/symfony/css-selector/tree/v7.1.0"
}, },
"funding": [ "funding": [
{ {
@ -12578,7 +12578,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:29:19+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
@ -12724,16 +12724,16 @@
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
"version": "v7.0.7", "version": "v7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher.git", "url": "https://github.com/symfony/event-dispatcher.git",
"reference": "db2a7fab994d67d92356bb39c367db115d9d30f9" "reference": "522d2772d6c7bab843b0c52466dc7844622bacc2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db2a7fab994d67d92356bb39c367db115d9d30f9", "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/522d2772d6c7bab843b0c52466dc7844622bacc2",
"reference": "db2a7fab994d67d92356bb39c367db115d9d30f9", "reference": "522d2772d6c7bab843b0c52466dc7844622bacc2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -12784,7 +12784,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/event-dispatcher/tree/v7.0.7" "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.0"
}, },
"funding": [ "funding": [
{ {
@ -12800,7 +12800,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:29:19+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{ {
"name": "symfony/event-dispatcher-contracts", "name": "symfony/event-dispatcher-contracts",
@ -13370,24 +13370,27 @@
}, },
{ {
"name": "symfony/intl", "name": "symfony/intl",
"version": "v7.0.7", "version": "v7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/intl.git", "url": "https://github.com/symfony/intl.git",
"reference": "dd12042707110995e2e7d80103f8d9928bea8621" "reference": "1b8974c7ff07c61d4acf0e873e34dfb75190b2bb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/intl/zipball/dd12042707110995e2e7d80103f8d9928bea8621", "url": "https://api.github.com/repos/symfony/intl/zipball/1b8974c7ff07c61d4acf0e873e34dfb75190b2bb",
"reference": "dd12042707110995e2e7d80103f8d9928bea8621", "reference": "1b8974c7ff07c61d4acf0e873e34dfb75190b2bb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2" "php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3"
},
"conflict": {
"symfony/string": "<7.1"
}, },
"require-dev": { "require-dev": {
"symfony/filesystem": "^6.4|^7.0", "symfony/filesystem": "^6.4|^7.0",
"symfony/finder": "^6.4|^7.0",
"symfony/var-exporter": "^6.4|^7.0" "symfony/var-exporter": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
@ -13433,7 +13436,7 @@
"localization" "localization"
], ],
"support": { "support": {
"source": "https://github.com/symfony/intl/tree/v7.0.7" "source": "https://github.com/symfony/intl/tree/v7.1.0"
}, },
"funding": [ "funding": [
{ {
@ -13449,7 +13452,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:29:19+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{ {
"name": "symfony/mailer", "name": "symfony/mailer",
@ -13687,16 +13690,16 @@
}, },
{ {
"name": "symfony/options-resolver", "name": "symfony/options-resolver",
"version": "v7.0.7", "version": "v7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/options-resolver.git", "url": "https://github.com/symfony/options-resolver.git",
"reference": "23cc173858776ad451e31f053b1c9f47840b2cfa" "reference": "9564f64c16f99e29f252eafc642965e8fcb755ce"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/options-resolver/zipball/23cc173858776ad451e31f053b1c9f47840b2cfa", "url": "https://api.github.com/repos/symfony/options-resolver/zipball/9564f64c16f99e29f252eafc642965e8fcb755ce",
"reference": "23cc173858776ad451e31f053b1c9f47840b2cfa", "reference": "9564f64c16f99e29f252eafc642965e8fcb755ce",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -13734,7 +13737,7 @@
"options" "options"
], ],
"support": { "support": {
"source": "https://github.com/symfony/options-resolver/tree/v7.0.7" "source": "https://github.com/symfony/options-resolver/tree/v7.1.0"
}, },
"funding": [ "funding": [
{ {
@ -13750,7 +13753,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:29:19+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
@ -14680,16 +14683,16 @@
}, },
{ {
"name": "symfony/property-access", "name": "symfony/property-access",
"version": "v7.0.7", "version": "v7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/property-access.git", "url": "https://github.com/symfony/property-access.git",
"reference": "8661b861480d2807eb2789ff99d034c0c71ab955" "reference": "1e8c1e6ac1b19cf945d8094a0ee50296872c4cb2"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/property-access/zipball/8661b861480d2807eb2789ff99d034c0c71ab955", "url": "https://api.github.com/repos/symfony/property-access/zipball/1e8c1e6ac1b19cf945d8094a0ee50296872c4cb2",
"reference": "8661b861480d2807eb2789ff99d034c0c71ab955", "reference": "1e8c1e6ac1b19cf945d8094a0ee50296872c4cb2",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -14736,7 +14739,7 @@
"reflection" "reflection"
], ],
"support": { "support": {
"source": "https://github.com/symfony/property-access/tree/v7.0.7" "source": "https://github.com/symfony/property-access/tree/v7.1.0"
}, },
"funding": [ "funding": [
{ {
@ -14752,25 +14755,26 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:29:19+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{ {
"name": "symfony/property-info", "name": "symfony/property-info",
"version": "v7.0.7", "version": "v7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/property-info.git", "url": "https://github.com/symfony/property-info.git",
"reference": "f0bdb46e19ab308527b324b7ec36161f6880a532" "reference": "b10cb8cf0179aec96769df2affb881ecfc293f79"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/property-info/zipball/f0bdb46e19ab308527b324b7ec36161f6880a532", "url": "https://api.github.com/repos/symfony/property-info/zipball/b10cb8cf0179aec96769df2affb881ecfc293f79",
"reference": "f0bdb46e19ab308527b324b7ec36161f6880a532", "reference": "b10cb8cf0179aec96769df2affb881ecfc293f79",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.2",
"symfony/string": "^6.4|^7.0" "symfony/string": "^6.4|^7.0",
"symfony/type-info": "^7.1"
}, },
"conflict": { "conflict": {
"phpdocumentor/reflection-docblock": "<5.2", "phpdocumentor/reflection-docblock": "<5.2",
@ -14819,7 +14823,7 @@
"validator" "validator"
], ],
"support": { "support": {
"source": "https://github.com/symfony/property-info/tree/v7.0.7" "source": "https://github.com/symfony/property-info/tree/v7.1.0"
}, },
"funding": [ "funding": [
{ {
@ -14835,7 +14839,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-28T11:44:19+00:00" "time": "2024-05-30T12:09:55+00:00"
}, },
{ {
"name": "symfony/psr-http-message-bridge", "name": "symfony/psr-http-message-bridge",
@ -15011,20 +15015,21 @@
}, },
{ {
"name": "symfony/serializer", "name": "symfony/serializer",
"version": "v7.0.7", "version": "v7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/serializer.git", "url": "https://github.com/symfony/serializer.git",
"reference": "08f0c517acf4b12dfc0d3963cd12f7b8023aea31" "reference": "972eb05320d06d07399b71b05e6da9032c865f1d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/serializer/zipball/08f0c517acf4b12dfc0d3963cd12f7b8023aea31", "url": "https://api.github.com/repos/symfony/serializer/zipball/972eb05320d06d07399b71b05e6da9032c865f1d",
"reference": "08f0c517acf4b12dfc0d3963cd12f7b8023aea31", "reference": "972eb05320d06d07399b71b05e6da9032c865f1d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "~1.8" "symfony/polyfill-ctype": "~1.8"
}, },
"conflict": { "conflict": {
@ -15054,6 +15059,7 @@
"symfony/property-access": "^6.4|^7.0", "symfony/property-access": "^6.4|^7.0",
"symfony/property-info": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0",
"symfony/translation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3",
"symfony/type-info": "^7.1",
"symfony/uid": "^6.4|^7.0", "symfony/uid": "^6.4|^7.0",
"symfony/validator": "^6.4|^7.0", "symfony/validator": "^6.4|^7.0",
"symfony/var-dumper": "^6.4|^7.0", "symfony/var-dumper": "^6.4|^7.0",
@ -15086,7 +15092,7 @@
"description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/serializer/tree/v7.0.7" "source": "https://github.com/symfony/serializer/tree/v7.1.0"
}, },
"funding": [ "funding": [
{ {
@ -15102,7 +15108,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-28T11:44:19+00:00" "time": "2024-05-21T15:59:31+00:00"
}, },
{ {
"name": "symfony/service-contracts", "name": "symfony/service-contracts",
@ -15189,16 +15195,16 @@
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v7.0.7", "version": "v7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63" "reference": "6f41b185e742737917e6f2e3eca37767fba5f17a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/e405b5424dc2528e02e31ba26b83a79fd4eb8f63", "url": "https://api.github.com/repos/symfony/string/zipball/6f41b185e742737917e6f2e3eca37767fba5f17a",
"reference": "e405b5424dc2528e02e31ba26b83a79fd4eb8f63", "reference": "6f41b185e742737917e6f2e3eca37767fba5f17a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -15212,6 +15218,7 @@
"symfony/translation-contracts": "<2.5" "symfony/translation-contracts": "<2.5"
}, },
"require-dev": { "require-dev": {
"symfony/emoji": "^7.1",
"symfony/error-handler": "^6.4|^7.0", "symfony/error-handler": "^6.4|^7.0",
"symfony/http-client": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0",
"symfony/intl": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0",
@ -15255,7 +15262,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v7.0.7" "source": "https://github.com/symfony/string/tree/v7.1.0"
}, },
"funding": [ "funding": [
{ {
@ -15271,7 +15278,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:29:19+00:00" "time": "2024-05-17T10:55:18+00:00"
}, },
{ {
"name": "symfony/translation", "name": "symfony/translation",
@ -15446,6 +15453,88 @@
], ],
"time": "2024-04-18T09:32:20+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{
"name": "symfony/type-info",
"version": "v7.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/type-info.git",
"reference": "b429d0710588fc396ba5def5329cf637d9861f9f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/type-info/zipball/b429d0710588fc396ba5def5329cf637d9861f9f",
"reference": "b429d0710588fc396ba5def5329cf637d9861f9f",
"shasum": ""
},
"require": {
"php": ">=8.2",
"psr/container": "^1.1|^2.0"
},
"conflict": {
"phpstan/phpdoc-parser": "<1.0",
"symfony/dependency-injection": "<6.4",
"symfony/property-info": "<6.4"
},
"require-dev": {
"phpstan/phpdoc-parser": "^1.0",
"symfony/dependency-injection": "^6.4|^7.0",
"symfony/property-info": "^6.4|^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\TypeInfo\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mathias Arlaud",
"email": "mathias.arlaud@gmail.com"
},
{
"name": "Baptiste LEDUC",
"email": "baptiste.leduc@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Extracts PHP types information.",
"homepage": "https://symfony.com",
"keywords": [
"PHPStan",
"phpdoc",
"symfony",
"type"
],
"support": {
"source": "https://github.com/symfony/type-info/tree/v7.1.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-05-02T10:19:13+00:00"
},
{ {
"name": "symfony/uid", "name": "symfony/uid",
"version": "v6.4.7", "version": "v6.4.7",
@ -15522,20 +15611,21 @@
}, },
{ {
"name": "symfony/validator", "name": "symfony/validator",
"version": "v7.0.7", "version": "v7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/validator.git", "url": "https://github.com/symfony/validator.git",
"reference": "ab4e75b9d23ba70e78480aecbe4d8da15adf10eb" "reference": "ffcc8c56502f6adaeaf6307aef5b98b53a8d0326"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/validator/zipball/ab4e75b9d23ba70e78480aecbe4d8da15adf10eb", "url": "https://api.github.com/repos/symfony/validator/zipball/ffcc8c56502f6adaeaf6307aef5b98b53a8d0326",
"reference": "ab4e75b9d23ba70e78480aecbe4d8da15adf10eb", "reference": "ffcc8c56502f6adaeaf6307aef5b98b53a8d0326",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.2", "php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-ctype": "~1.8", "symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php83": "^1.27", "symfony/polyfill-php83": "^1.27",
@ -15568,6 +15658,7 @@
"symfony/property-access": "^6.4|^7.0", "symfony/property-access": "^6.4|^7.0",
"symfony/property-info": "^6.4|^7.0", "symfony/property-info": "^6.4|^7.0",
"symfony/translation": "^6.4.3|^7.0.3", "symfony/translation": "^6.4.3|^7.0.3",
"symfony/type-info": "^7.1",
"symfony/yaml": "^6.4|^7.0" "symfony/yaml": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
@ -15596,7 +15687,7 @@
"description": "Provides tools to validate values", "description": "Provides tools to validate values",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/validator/tree/v7.0.7" "source": "https://github.com/symfony/validator/tree/v7.1.0"
}, },
"funding": [ "funding": [
{ {
@ -15612,7 +15703,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-28T11:44:19+00:00" "time": "2024-05-21T15:59:31+00:00"
}, },
{ {
"name": "symfony/var-dumper", "name": "symfony/var-dumper",
@ -20520,16 +20611,16 @@
}, },
{ {
"name": "symfony/stopwatch", "name": "symfony/stopwatch",
"version": "v7.0.7", "version": "v7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/stopwatch.git", "url": "https://github.com/symfony/stopwatch.git",
"reference": "41a7a24aa1dc82adf46a06bc292d1923acfe6b84" "reference": "13c750a45ac43c45f45d944d22499768aa1b72d8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/stopwatch/zipball/41a7a24aa1dc82adf46a06bc292d1923acfe6b84", "url": "https://api.github.com/repos/symfony/stopwatch/zipball/13c750a45ac43c45f45d944d22499768aa1b72d8",
"reference": "41a7a24aa1dc82adf46a06bc292d1923acfe6b84", "reference": "13c750a45ac43c45f45d944d22499768aa1b72d8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -20562,7 +20653,7 @@
"description": "Provides a way to profile code", "description": "Provides a way to profile code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/stopwatch/tree/v7.0.7" "source": "https://github.com/symfony/stopwatch/tree/v7.1.0"
}, },
"funding": [ "funding": [
{ {
@ -20578,7 +20669,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-04-18T09:29:19+00:00" "time": "2024-04-18T09:32:20+00:00"
}, },
{ {
"name": "theseer/tokenizer", "name": "theseer/tokenizer",
@ -20650,5 +20741,5 @@
"platform-dev": { "platform-dev": {
"php": "^8.2" "php": "^8.2"
}, },
"plugin-api-version": "2.3.0" "plugin-api-version": "2.6.0"
} }

View File

@ -201,6 +201,7 @@ return [
App\Providers\MultiDBProvider::class, App\Providers\MultiDBProvider::class,
App\Providers\ClientPortalServiceProvider::class, App\Providers\ClientPortalServiceProvider::class,
App\Providers\NinjaTranslationServiceProvider::class, App\Providers\NinjaTranslationServiceProvider::class,
// App\Providers\StaticServiceProvider::class,
], ],
/* /*

View File

@ -199,7 +199,7 @@ $lang = array(
'removed_logo' => 'Successfully removed logo', 'removed_logo' => 'Successfully removed logo',
'sent_message' => 'Successfully sent message', 'sent_message' => 'Successfully sent message',
'invoice_error' => 'Please make sure to select a client and correct any errors', 'invoice_error' => 'Please make sure to select a client and correct any errors',
'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!',
'payment_error' => 'There was an error processing your payment. Please try again later.', 'payment_error' => 'There was an error processing your payment. Please try again later.',
'registration_required' => 'Registration Required', 'registration_required' => 'Registration Required',
'confirmation_required' => 'Please confirm your email address, :link to resend the confirmation email.', 'confirmation_required' => 'Please confirm your email address, :link to resend the confirmation email.',
@ -5147,7 +5147,7 @@ $lang = array(
'payment_refund_receipt' => 'Payment Refund Receipt # :number', 'payment_refund_receipt' => 'Payment Refund Receipt # :number',
'payment_receipt' => 'Payment Receipt # :number', 'payment_receipt' => 'Payment Receipt # :number',
'load_template_description' => 'The template will be applied to following:', 'load_template_description' => 'The template will be applied to following:',
'run_template' => 'Run template', 'run_template' => 'Run Template',
'statement_design' => 'Statement Design', 'statement_design' => 'Statement Design',
'delivery_note_design' => 'Delivery Note Design', 'delivery_note_design' => 'Delivery Note Design',
'payment_receipt_design' => 'Payment Receipt Design', 'payment_receipt_design' => 'Payment Receipt Design',
@ -5306,18 +5306,20 @@ $lang = array(
'activity_140' => 'Statement sent to :client', 'activity_140' => 'Statement sent to :client',
'invoice_net_amount' => 'Invoice Net Amount', 'invoice_net_amount' => 'Invoice Net Amount',
'round_to_minutes' => 'Round To Minutes', 'round_to_minutes' => 'Round To Minutes',
'1_second' => '1 Second',
'1_minute' => '1 Minute', '1_minute' => '1 Minute',
'5_minutes' => '5 Minutes', '5_minutes' => '5 Minutes',
'15_minutes' => '15 Minutes', '15_minutes' => '15 Minutes',
'30_minutes' => '30 Minutes', '30_minutes' => '30 Minutes',
'1_hour' => '1 Hour', '1_hour' => '1 Hour',
'1_day' => '1 Day', '1_day' => '1 Day',
'round_tasks' => 'Round Tasks', 'round_tasks' => 'Task Rounding Direction',
'round_tasks_help' => 'Round time intervals when saving tasks', 'round_tasks_help' => 'Round task times up or down.',
'direction' => 'Direction', 'direction' => 'Direction',
'round_up' => 'Round Up', 'round_up' => 'Round Up',
'round_down' => 'Round Down', 'round_down' => 'Round Down',
'task_round_to_nearest' => 'Round To Nearest', 'task_round_to_nearest' => 'Round To Nearest',
'task_round_to_nearest_help' => 'The interval to round the task to.',
'bulk_updated' => 'Successfully updated data', 'bulk_updated' => 'Successfully updated data',
'bulk_update' => 'Bulk Update', 'bulk_update' => 'Bulk Update',
'calculate' => 'Calculate', 'calculate' => 'Calculate',
@ -5328,9 +5330,10 @@ $lang = array(
'disconnected' => 'Disconnected', 'disconnected' => 'Disconnected',
'reconnect' => 'Reconnect', 'reconnect' => 'Reconnect',
'e_invoice_settings' => 'E-Invoice Settings', 'e_invoice_settings' => 'E-Invoice Settings',
'btcpay_refund_subject' => 'Refund of your invoice via BTCPay',
'btcpay_refund_body' => 'A refund intended for you has been issued. To claim it via BTCPay, please click on this link:',
'currency_mauritanian_ouguiya' => 'Mauritanian Ouguiya', 'currency_mauritanian_ouguiya' => 'Mauritanian Ouguiya',
'currency_bhutan_ngultrum' => 'Bhutan Ngultrum', 'currency_bhutan_ngultrum' => 'Bhutan Ngultrum',
); );
return $lang; return $lang;

View File

@ -5322,6 +5322,12 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'money' => 'Argent', 'money' => 'Argent',
'web_app' => 'App web', 'web_app' => 'App web',
'desktop_app' => 'App de bureau', 'desktop_app' => 'App de bureau',
'disconnected' => 'Déconnecté',
'reconnect' => 'Reconnecté',
'e_invoice_settings' => 'Paramètres E-Facture',
'currency_mauritanian_ouguiya' => 'Ouguiya mauritanien',
'currency_bhutan_ngultrum' => 'Ngultrum Bhoutan',
); );
return $lang; return $lang;

1982
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -9,18 +9,20 @@
"@babel/compat-data": "7.15.0", "@babel/compat-data": "7.15.0",
"@babel/plugin-proposal-class-properties": "^7.14.5", "@babel/plugin-proposal-class-properties": "^7.14.5",
"@tailwindcss/aspect-ratio": "^0.4.2", "@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/forms": "^0.5.7",
"@tailwindcss/line-clamp": "^0.4.4",
"@tailwindcss/typography": "^0.5.10",
"autoprefixer": "^10.4.18",
"cypress": "^12.5.1", "cypress": "^12.5.1",
"laravel-mix-purgecss": "^6.0.0", "laravel-mix-purgecss": "^6.0.0",
"laravel-vite-plugin": "^0.8.0", "laravel-vite-plugin": "^0.8.0",
"postcss": "^8.4.35",
"tailwindcss": "^3.4.1",
"vite": "^4.4.9", "vite": "^4.4.9",
"vite-plugin-static-copy": "^0.17.0", "vite-plugin-static-copy": "^0.17.0",
"vue-template-compiler": "^2.6.14" "vue-template-compiler": "^2.6.14"
}, },
"dependencies": { "dependencies": {
"@tailwindcss/forms": "^0.3.4",
"@tailwindcss/line-clamp": "^0.3.1",
"@tailwindcss/typography": "^0.4.1",
"autoprefixer": "^10.3.7",
"axios": "^0.25", "axios": "^0.25",
"card-js": "^1.0.13", "card-js": "^1.0.13",
"card-validator": "^8.1.1", "card-validator": "^8.1.1",
@ -31,11 +33,9 @@
"laravel-mix": "^6.0.34", "laravel-mix": "^6.0.34",
"linkify-urls": "^4.0.0", "linkify-urls": "^4.0.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"postcss": "^8.3.11",
"resolve-url-loader": "^4.0.0", "resolve-url-loader": "^4.0.0",
"sass": "^1.43.4", "sass": "^1.43.4",
"sass-loader": "^12.3.0", "sass-loader": "^12.3.0"
"tailwindcss": "^2.2.17"
}, },
"type": "module" "type": "module"
} }

109
public/build/assets/app-8722f22d.js vendored Normal file

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
public/build/assets/app-c7c5fad4.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@
] ]
}, },
"resources/js/app.js": { "resources/js/app.js": {
"file": "assets/app-a52d5f77.js", "file": "assets/app-8722f22d.js",
"imports": [ "imports": [
"_index-08e160a7.js", "_index-08e160a7.js",
"__commonjsHelpers-725317a4.js" "__commonjsHelpers-725317a4.js"
@ -240,7 +240,7 @@
"src": "resources/js/setup/setup.js" "src": "resources/js/setup/setup.js"
}, },
"resources/sass/app.scss": { "resources/sass/app.scss": {
"file": "assets/app-c6dc74fe.css", "file": "assets/app-c7c5fad4.css",
"isEntry": true, "isEntry": true,
"src": "resources/sass/app.scss" "src": "resources/sass/app.scss"
} }

View File

@ -3,7 +3,7 @@
} }
.alert-success { .alert-success {
@apply border-green-500; @apply border-emerald-500;
} }
.alert-failure { .alert-failure {

View File

@ -15,7 +15,7 @@
} }
.badge-success { .badge-success {
@apply bg-green-100 text-green-500; @apply bg-emerald-100 text-emerald-500;
} }
.badge-secondary { .badge-secondary {
@ -23,7 +23,7 @@
} }
.badge-warning { .badge-warning {
@apply bg-blue-500 text-yellow-600; @apply bg-blue-500 text-amber-600;
} }
.badge-info { .badge-info {

View File

@ -7,5 +7,5 @@
} }
.validation-pass { .validation-pass {
@apply border-green-500 text-gray-700 text-sm; @apply border-emerald-500 text-gray-700 text-sm;
} }

View File

@ -132,7 +132,7 @@
<div class="flex justify-between items-center mt-8"> <div class="flex justify-between items-center mt-8">
<a href="{{route('client.login')}}" class="button button-info bg-green-600 text-white">{{ ctrans('texts.login_label') }}</a> <a href="{{route('client.login')}}" class="button button-info bg-emerald-600 text-white">{{ ctrans('texts.login_label') }}</a>
<span class="inline-flex items-center" x-data="{ terms_of_service: false, privacy_policy: false }"> <span class="inline-flex items-center" x-data="{ terms_of_service: false, privacy_policy: false }">
@if(!empty($register_company->settings->client_portal_terms) || !empty($register_company->settings->client_portal_privacy_policy)) @if(!empty($register_company->settings->client_portal_terms) || !empty($register_company->settings->client_portal_privacy_policy))

View File

@ -250,7 +250,7 @@
@if($steps['passwordless_login_sent']) @if($steps['passwordless_login_sent'])
<span <span
class="block mt-2 text-sm text-green-600">{!! ctrans('texts.sent') !!}</span> class="block mt-2 text-sm text-emerald-600">{!! ctrans('texts.sent') !!}</span>
@endif @endif
@endif @endif

View File

@ -15,22 +15,22 @@
<table class="min-w-full shadow rounded border border-gray-200 mt-4 credits-table bg-white"> <table class="min-w-full shadow rounded border border-gray-200 mt-4 credits-table bg-white">
<thead> <thead>
<tr> <tr>
<th class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-white uppercase border-b border-gray-200 bg-primary"> <th class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-white uppercase border-b border-gray-200 bg-primary task_description">
<span role="button" wire:click="sortBy('description')" class="cursor-pointer"> <span role="button" wire:click="sortBy('description')" class="cursor-pointer">
{{ ctrans('texts.description') }} {{ ctrans('texts.description') }}
</span> </span>
</th> </th>
<th class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-white uppercase border-b border-gray-200 bg-primary"> <th class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-white uppercase border-b border-gray-200 bg-primary task_project">
<span role="button" wire:click="sortBy('description')" class="cursor-pointer"> <span role="button" wire:click="sortBy('description')" class="cursor-pointer">
{{ ctrans('texts.project') }} {{ ctrans('texts.project') }}
</span> </span>
</th> </th>
<th class="px-6 py-3 border-b border-gray-200 bg-primary text-left text-xs leading-4 font-medium text-white uppercase tracking-wider"> <th class="px-6 py-3 border-b border-gray-200 bg-primary text-left text-xs leading-4 font-medium text-white uppercase tracking-wider task_status">
<span role="button" wire:click="sortBy('status_id')" class="cursor-pointer"> <span role="button" wire:click="sortBy('status_id')" class="cursor-pointer">
{{ ctrans('texts.status') }} {{ ctrans('texts.status') }}
</span> </span>
</th> </th>
<th class="px-6 py-3 border-b border-gray-200 bg-primary text-left text-xs leading-4 font-medium text-white uppercase tracking-wider"> <th class="px-6 py-3 border-b border-gray-200 bg-primary text-left text-xs leading-4 font-medium text-white uppercase tracking-wider task_duration">
<span role="button" class="cursor-pointer"> <span role="button" class="cursor-pointer">
{{ ctrans('texts.duration') }} {{ ctrans('texts.duration') }}
</span> </span>
@ -40,13 +40,13 @@
<tbody> <tbody>
@foreach($tasks as $task) @foreach($tasks as $task)
<tr class="bg-white group hover:bg-gray-100"> <tr class="bg-white group hover:bg-gray-100">
<td class="px-6 py-4 whitespace-nowrap text-sm leading-5 text-gray-500"> <td class="px-6 py-4 whitespace-nowrap text-sm leading-5 text-gray-500 task_descripton">
{{ \Illuminate\Support\Str::limit($task->description, 80) }} {{ \Illuminate\Support\Str::limit($task->description, 80) }}
</td> </td>
<td class="px-6 py-4 whitespace-nowrap text-sm leading-5 text-gray-500"> <td class="px-6 py-4 whitespace-nowrap text-sm leading-5 text-gray-500 task_project">
{{ $task->project?->name }} {{ $task->project?->name }}
</td> </td>
<td class="px-6 py-4 whitespace-nowrap text-sm leading-5 text-gray-500"> <td class="px-6 py-4 whitespace-nowrap text-sm leading-5 text-gray-500 task_status">
<div class="flex"> <div class="flex">
{!! $task->stringStatus() !!} {!! $task->stringStatus() !!}
@ -59,7 +59,7 @@
@endif @endif
</div> </div>
</td> </td>
<td class="px-6 py-4 whitespace-nowrap text-sm leading-5 text-gray-500"> <td class="px-6 py-4 whitespace-nowrap text-sm leading-5 text-gray-500 task_duration">
{{ \Carbon\CarbonInterval::seconds($task->calcDuration())->cascade()->forHumans() }} {{ \Carbon\CarbonInterval::seconds($task->calcDuration())->cascade()->forHumans() }}
</td> </td>
</tr> </tr>
@ -68,17 +68,17 @@
<table class="min-w-full ml-5"> <table class="min-w-full ml-5">
<thead> <thead>
<tr> <tr>
<th class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-white uppercase border-b border-gray-200 bg-gray-500"> <th class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-white uppercase border-b border-gray-200 bg-gray-500 task_date">
<span> <span>
{{ ctrans('texts.date') }} {{ ctrans('texts.date') }}
</span> </span>
</th> </th>
<th class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-white uppercase border-b border-gray-200 bg-gray-500"> <th class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-white uppercase border-b border-gray-200 bg-gray-500 task_duration">
<span> <span>
{{ ctrans('texts.duration') }} {{ ctrans('texts.duration') }}
</span> </span>
</th> </th>
<th colspan="4" class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-white uppercase border-b border-gray-200 bg-gray-500"> <th colspan="4" class="px-6 py-3 text-xs font-medium leading-4 tracking-wider text-left text-white uppercase border-b border-gray-200 bg-gray-500 task_description">
<span> <span>
{{ ctrans('texts.description') }} {{ ctrans('texts.description') }}
</span> </span>
@ -89,13 +89,13 @@
@foreach($task->processLogsExpandedNotation() as $log) @foreach($task->processLogsExpandedNotation() as $log)
@if(strlen($log['description']) > 1) @if(strlen($log['description']) > 1)
<tr class="bg-white group border-b border-gray-100"> <tr class="bg-white group border-b border-gray-100">
<td class="px-6 py-4 text-sm leading-5 text-gray-500 w-1/6"> <td class="px-6 py-4 text-sm leading-5 text-gray-500 w-1/6 task_date">
{{ $log['start_date']}} {{ $log['start_date']}}
</td> </td>
<td class="px-6 py-4 text-sm leading-5 text-gray-500 w-1/6"> <td class="px-6 py-4 text-sm leading-5 text-gray-500 w-1/6 task_duration">
{{ $log['duration']}} {{ $log['duration']}}
</td> </td>
<td colspan="4" class="px-6 py-4 text-sm leading-5 text-gray-500 w-4/6"> <td colspan="4" class="px-6 py-4 text-sm leading-5 text-gray-500 w-4/6 task_description">
{!! nl2br(e($log['description'])) !!} {!! nl2br(e($log['description'])) !!}
</td> </td>
</tr> </tr>

View File

@ -5,10 +5,10 @@
<div class="flex flex-col xl:flex-row gap-4"> <div class="flex flex-col xl:flex-row gap-4">
<div class="w-full rounded-md border border-[#E5E7EB] bg-white p-5 text-sm text-[#6C727F]"> <div class="w-full rounded-md border border-[#E5E7EB] bg-white p-5 text-sm text-[#6C727F]">
<h3 class="mb-4 text-xl font-semibold text-[#212529]">{{ $contact->first_name }} {{ $contact->last_name }}</h3> <h3 class="mb-4 text-xl font-semibold text-[#212529]">{{ $contact->first_name }} {{ $contact->last_name }}</h3>
<p class="mb-1.5">{{ $contact->phone }}</p> <p>{{ $contact->phone }}</p>
<p class="mb-4">{{ $client->address1 }}</p> <p>{{ $client->address1 }}</p>
<p class="mb-1.5">{{ $client->city }}, {{ $client->state }}</p> <p>{{ $client->city }}, {{ $client->state }}</p>
<p class="mb-1.5">{{ $client->postal_code }}</p> <p>{{ $client->postal_code }}</p>
<p>{{ App\Models\Country::find($client->country_id)?->name }}</p> <p>{{ App\Models\Country::find($client->country_id)?->name }}</p>
</div> </div>
@ -81,16 +81,24 @@
</div> </div>
</div> </div>
<div class="text-light-grey-text flex grow basis-full flex-col justify-center pt-5 text-sm md:basis-1/2 md:border-r md:border-[#E5E7EB] md:pt-0 xl:basis-auto xl:px-5"> <div class="text-light-grey-text flex grow basis-full flex-col justify-center pt-5 text-sm md:basis-1/2 md:border-r md:border-[#E5E7EB] md:pt-0 xl:basis-auto xl:px-5 space-y-2">
<p class="mb-2">{{ $client->company->settings->address1 }}</p> <p>{{ $client->company->settings->address1 }}</p>
<p class="mb-2">{{ $client->company->settings->address2 }}</p> <p>{{ $client->company->settings->city }} {{ $client->company->settings->state }}</p>
<p class="mb-2">{{ $client->company->settings->postal_code }}</p> <p>{{ $client->company->settings->postal_code }}</p>
<p>{{ App\Models\Country::find($client->company->settings->country_id)?->name }}</p> <p>{{ App\Models\Country::find($client->company->settings->country_id)?->name }}</p>
</div> </div>
<div class="text-light-grey-text flex grow basis-full flex-col justify-center text-sm md:basis-1/2 md:pl-4 xl:basis-auto xl:px-5">
<p class="mb-2">{{ $client->company->settings->email }}</p> <div class="text-light-grey-text flex grow basis-full flex-col justify-center text-sm md:basis-1/2 md:pl-4 xl:basis-auto xl:px-5 space-y-2 mt-3 xl:mt-0">
<p class="mb-2">{{ $client->company->settings->phone }}</p> <p><span class="font-semibold">{{ ctrans('texts.vat') }}</span>: {{ $client->company->settings->vat_number }}</p>
<p>{{ $client->company->settings->website }}</p> <p>
<a class="underline" href="mailto:{{ $client->company->settings->email }}" target="_blank">{{ $client->company->settings->email }}</a>
</p>
<p>{{ $client->company->settings->phone }}</p>
<p>
<a class="underline" href="{{ $client->company->settings->website }}" target="_blank">
{{ $client->company->settings->website }}
</a>
</p>
</div> </div>
</div> </div>
@stop @stop

View File

@ -34,7 +34,7 @@
@if(Request::isSecure()) @if(Request::isSecure())
<span class="block mx-4 mb-4 text-xs inline-flex items-center"> <span class="block mx-4 mb-4 text-xs inline-flex items-center">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="text-green-600"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg> <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="text-emerald-600"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>
<span class="ml-1">Secure 256-bit encryption</span> <span class="ml-1">Secure 256-bit encryption</span>
</span> </span>
@endif @endif

View File

@ -56,7 +56,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="bg-white shadow rounded-sm mb-4 mt-4 border-l-2 border-green-500" translate> <div class="bg-white shadow rounded-sm mb-4 mt-4 border-l-2 border-emerald-500" translate>
<div class="px-4 py-5 sm:p-6"> <div class="px-4 py-5 sm:p-6">
<div class="sm:flex sm:items-start sm:justify-between"> <div class="sm:flex sm:items-start sm:justify-between">
<div> <div>

View File

@ -1,27 +1,24 @@
const defaultTheme = require("tailwindcss/defaultTheme"); const defaultTheme = require('tailwindcss/defaultTheme');
module.exports = { module.exports = {
purge: [ content: [
'./resources/views/portal/ninja2020/**/*.blade.php', './resources/views/portal/ninja2020/**/*.blade.php',
'./resources/views/email/template/**/*.blade.php', './resources/views/email/template/**/*.blade.php',
'./resources/views/email/components/**/*.blade.php', './resources/views/email/components/**/*.blade.php',
'./resources/views/themes/ninja2020/**/*.blade.php', './resources/views/themes/ninja2020/**/*.blade.php',
'./resources/views/auth/**/*.blade.php', './resources/views/auth/**/*.blade.php',
'./resources/views/setup/**/*.blade.php', './resources/views/setup/**/*.blade.php',
'./resources/views/billing-portal/**/*.blade.php', './resources/views/billing-portal/**/*.blade.php'
], ],
theme: { theme: {
extend: { extend: {
fontFamily: { fontFamily: {
sans: ["Open Sans", ...defaultTheme.fontFamily.sans] sans: ['Open Sans', ...defaultTheme.fontFamily.sans],
} },
} },
}, },
variants: {},
plugins: [ plugins: [
require('@tailwindcss/line-clamp'),
require('@tailwindcss/forms'), require('@tailwindcss/forms'),
require('@tailwindcss/typography'), require('@tailwindcss/typography'),
] ],
}; };