diff --git a/README.md b/README.md
index 5426d3a18220..0c5c0004200b 100644
--- a/README.md
+++ b/README.md
@@ -26,15 +26,14 @@ All Pro and Enterprise features from the hosted app are included in the open-cod
* [Support Forum](https://forum.invoiceninja.com)
* [StackOverflow](https://stackoverflow.com/tags/invoice-ninja/)
-## Mobile App
-* [iPhone](https://apps.apple.com/us/app/invoice-ninja-v5/id1503970375#?platform=iphone)
+## Mobile Apps
+* [iPhone](https://apps.apple.com/app/id1503970375?platform=iphone)
* [Android](https://play.google.com/store/apps/details?id=com.invoiceninja.app)
-* [Linux](https://github.com/invoiceninja/flutter-mobile)
-## Desktop App
-* [MacOS](https://apps.apple.com/app/id1503970375)
+## Desktop Apps
+* [macOS](https://apps.apple.com/app/id1503970375?platform=mac)
* [Windows](https://microsoft.com/en-us/p/invoice-ninja/9n3f2bbcfdr6)
-* [MacOS Desktop](https://snapcraft.io/invoiceninja)
+* [Linux](https://snapcraft.io/invoiceninja)
## Installation Options
diff --git a/app/Console/Commands/SendRemindersCron.php b/app/Console/Commands/SendRemindersCron.php
index f8f69a30dd60..ad0b99387a65 100644
--- a/app/Console/Commands/SendRemindersCron.php
+++ b/app/Console/Commands/SendRemindersCron.php
@@ -175,7 +175,7 @@ class SendRemindersCron extends Command
/**Refresh Invoice values*/
$invoice->calc()->getInvoice()->save();
$invoice->fresh();
- $invoice->service()->deletePdf();
+ $invoice->service()->deletePdf()->save();
/* Refresh the client here to ensure the balance is fresh */
$client = $invoice->client;
diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php
index d62d14c19037..56400e7e1285 100644
--- a/app/Http/Controllers/BaseController.php
+++ b/app/Http/Controllers/BaseController.php
@@ -1000,42 +1000,6 @@ class BaseController extends Controller
return redirect('/setup');
}
- public function reactCatch()
- {
-
- if ((bool) $this->checkAppSetup() !== false && $account = Account::first()) {
- if (config('ninja.require_https') && ! request()->isSecure()) {
- return redirect()->secure(request()->getRequestUri());
- }
-
- $data = [];
-
- //pass report errors bool to front end
- $data['report_errors'] = Ninja::isSelfHost() ? $account->report_errors : true;
-
- //pass referral code to front end
- $data['rc'] = request()->has('rc') ? request()->input('rc') : '';
- $data['build'] = request()->has('build') ? request()->input('build') : '';
- $data['login'] = request()->has('login') ? request()->input('login') : 'false';
- $data['signup'] = request()->has('signup') ? request()->input('signup') : 'false';
-
- $data['user_agent'] = request()->server('HTTP_USER_AGENT');
-
- $data['path'] = $this->setBuild();
-
- $this->buildCache();
-
- if (Ninja::isSelfHost() && $account->set_react_as_default_ap) {
- return view('react.index', $data);
- } else {
- abort('page not found', 404);
- }
- }
-
- return redirect('/setup');
- }
-
-
private function setBuild()
{
$build = '';
diff --git a/app/Http/Requests/BankTransaction/MatchBankTransactionRequest.php b/app/Http/Requests/BankTransaction/MatchBankTransactionRequest.php
index 76dc1e349c87..280565926737 100644
--- a/app/Http/Requests/BankTransaction/MatchBankTransactionRequest.php
+++ b/app/Http/Requests/BankTransaction/MatchBankTransactionRequest.php
@@ -31,12 +31,12 @@ class MatchBankTransactionRequest extends Request
$rules = [
'transactions' => 'bail|array',
- 'transactions.*.id' => 'bail|required',
'transactions.*.invoice_ids' => 'nullable|string|sometimes',
];
$rules['transactions.*.ninja_category_id'] = 'bail|nullable|sometimes|exists:expense_categories,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
$rules['transactions.*.vendor_id'] = 'bail|sometimes|exists:vendors,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
+ $rules['transactions.*.id'] = 'bail|required|exists:bank_transactions,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
return $rules;
diff --git a/app/Jobs/Bank/MatchBankTransactions.php b/app/Jobs/Bank/MatchBankTransactions.php
index 17e3a61a960d..d99c8fadb644 100644
--- a/app/Jobs/Bank/MatchBankTransactions.php
+++ b/app/Jobs/Bank/MatchBankTransactions.php
@@ -160,6 +160,9 @@ class MatchBankTransactions implements ShouldQueue
{
$this->bt = BankTransaction::find($input['id']);
+ if(!$this->bt || $this->bt->status_id == BankTransaction::STATUS_CONVERTED)
+ return $this;
+
$_invoices = Invoice::withTrashed()->find($this->getInvoices($input['invoice_ids']));
$amount = $this->bt->amount;
@@ -180,6 +183,10 @@ class MatchBankTransactions implements ShouldQueue
//if there is a category id, pull it from Yodlee and insert - or just reuse!!
$this->bt = BankTransaction::find($input['id']);
+ if(!$this->bt || $this->bt->status_id == BankTransaction::STATUS_CONVERTED)
+ return $this;
+
+
$expense = ExpenseFactory::create($this->bt->company_id, $this->bt->user_id);
$expense->category_id = $this->resolveCategory($input);
$expense->amount = $this->bt->amount;
diff --git a/app/Mail/Engine/PaymentEmailEngine.php b/app/Mail/Engine/PaymentEmailEngine.php
index f1eaac47ffb5..bf15b7aa2ca4 100644
--- a/app/Mail/Engine/PaymentEmailEngine.php
+++ b/app/Mail/Engine/PaymentEmailEngine.php
@@ -243,6 +243,14 @@ class PaymentEmailEngine extends BaseEmailEngine
$data['$invoices.due_date'] = ['value' => $this->formatInvoiceField('due_date'), 'label' => ctrans('texts.invoices')];
$data['$invoices.po_number'] = ['value' => $this->formatInvoiceField('po_number'), 'label' => ctrans('texts.invoices')];
+
+ if($this->payment->status_id == 4) {
+ $data['$status_logo'] = ['value' => '
' . ctrans('texts.paid') .'
', 'label' => ''];
+ }
+ else
+ $data['$status_logo'] = ['value' => '', 'label' => ''];
+
+
$arrKeysLength = array_map('strlen', array_keys($data));
array_multisort($arrKeysLength, SORT_DESC, $data);
diff --git a/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php b/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php
index 84477c155554..a49b98713a2b 100644
--- a/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php
+++ b/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php
@@ -136,3 +136,36 @@ class AuthorizeCreateCustomer
// }
// }
}
+
+// $request = new net\authorize\api\contract\v1\GetCustomerProfileIdsRequest();
+// $request->setMerchantAuthentication($auth->merchant_authentication);
+// $controller = new net\authorize\api\controller\GetCustomerProfileIdsController($request);
+// $response = $controller->executeWithApiResponse($auth->mode());
+
+// // $customer_profile_id = end($response->getIds());
+
+// foreach($response->getIds() as $customer_profile_id)
+// {
+// $request = new net\authorize\api\contract\v1\GetCustomerProfileRequest();
+// $request->setMerchantAuthentication($auth->merchant_authentication);
+// $request->setCustomerProfileId($customer_profile_id);
+// $controller = new net\authorize\api\controller\GetCustomerProfileController($request);
+// $response = $controller->executeWithApiResponse($auth->mode());
+
+// $profileSelected = $response->getProfile();
+
+// if($profileSelected->getEmail() == 'katnandan@gmail.com')
+// {
+
+// $profileSelected;
+// break;
+
+// }
+
+
+// }
+
+
+
+
+
diff --git a/app/PaymentDrivers/GoCardless/InstantBankPay.php b/app/PaymentDrivers/GoCardless/InstantBankPay.php
index a5f8aafa7f21..3d5cf238272a 100644
--- a/app/PaymentDrivers/GoCardless/InstantBankPay.php
+++ b/app/PaymentDrivers/GoCardless/InstantBankPay.php
@@ -97,6 +97,8 @@ class InstantBankPay implements MethodInterface
$this->go_cardless->setPaymentHash(
$request->getPaymentHash()
);
+
+ $this->go_cardless->init();
try {
$billing_request = $this->go_cardless->gateway->billingRequests()->get(
diff --git a/app/PaymentDrivers/GoCardlessPaymentDriver.php b/app/PaymentDrivers/GoCardlessPaymentDriver.php
index a1db5c298a48..24822c2b289c 100644
--- a/app/PaymentDrivers/GoCardlessPaymentDriver.php
+++ b/app/PaymentDrivers/GoCardlessPaymentDriver.php
@@ -291,13 +291,13 @@ class GoCardlessPaymentDriver extends BaseDriver
return response()->json([], 200);
}
- $this->go_cardless->setPaymentHash($hash);
+ $this->setPaymentHash($hash);
- $billing_request = $this->go_cardless->gateway->billingRequests()->get(
+ $billing_request = $this->gateway->billingRequests()->get(
$event['links']['billing_request']
);
- $payment = $this->go_cardless->gateway->payments()->get(
+ $payment = $this->gateway->payments()->get(
$billing_request->payment_request->links->payment
);
@@ -305,12 +305,12 @@ class GoCardlessPaymentDriver extends BaseDriver
$invoices = Invoice::whereIn('id', $this->transformKeys(array_column($hash->invoices(), 'invoice_id')))->withTrashed()->get();
- $this->go_cardless->client = $invoices->first()->client;
+ $this->client = $invoices->first()->client;
$invoices->each(function ($invoice){
//if payments exist already, they just need to be confirmed.
- if($invoice->payments()->exists){
+ if($invoice->payments()->exists()){
$invoice->payments()->where('status_id', 1)->cursor()->each(function ($payment){
$payment->status_id = 4;
@@ -347,12 +347,12 @@ class GoCardlessPaymentDriver extends BaseDriver
$data = [
'payment_method' => $payment->links->mandate,
'payment_type' => PaymentType::INSTANT_BANK_PAY,
- 'amount' => $this->go_cardless->payment_hash->data->amount_with_fee,
+ 'amount' => $this->payment_hash->data->amount_with_fee,
'transaction_reference' => $payment->id,
'gateway_type_id' => GatewayType::INSTANT_BANK_PAY,
];
- $payment = $this->go_cardless->createPayment($data, Payment::STATUS_COMPLETED);
+ $payment = $this->createPayment($data, Payment::STATUS_COMPLETED);
$payment->status_id = Payment::STATUS_COMPLETED;
$payment->save();
@@ -361,8 +361,8 @@ class GoCardlessPaymentDriver extends BaseDriver
SystemLog::CATEGORY_GATEWAY_RESPONSE,
SystemLog::EVENT_GATEWAY_SUCCESS,
SystemLog::TYPE_GOCARDLESS,
- $this->go_cardless->client,
- $this->go_cardless->client->company,
+ $this->client,
+ $this->client->company,
);
}
diff --git a/app/Repositories/BaseRepository.php b/app/Repositories/BaseRepository.php
index 4d9451dcf83a..110567910cda 100644
--- a/app/Repositories/BaseRepository.php
+++ b/app/Repositories/BaseRepository.php
@@ -187,7 +187,7 @@ class BaseRepository
if(!$model->id){
$this->new_model = true;
- if(is_array($model->line_items))
+ if(is_array($model->line_items) && !($model instanceof RecurringInvoice))
{
$model->line_items = (collect($model->line_items))->map(function ($item) use($model,$client) {
diff --git a/app/Services/PdfMaker/Design.php b/app/Services/PdfMaker/Design.php
index 03e5e686a2ae..b47884b63a93 100644
--- a/app/Services/PdfMaker/Design.php
+++ b/app/Services/PdfMaker/Design.php
@@ -73,7 +73,8 @@ class Design extends BaseDesign
const PLAIN = 'plain';
const PLAYFUL = 'playful';
const CUSTOM = 'custom';
-
+ const CALM = 'calm';
+
const DELIVERY_NOTE = 'delivery_note';
const STATEMENT = 'statement';
const PURCHASE_ORDER = 'purchase_order';
diff --git a/app/Utils/Helpers.php b/app/Utils/Helpers.php
index fee637ec83e7..25a36e55d09e 100644
--- a/app/Utils/Helpers.php
+++ b/app/Utils/Helpers.php
@@ -114,7 +114,7 @@ class Helpers
return '';
}
- // 04-10-2022 Return Early if no reserved keywords are present, this is a very expenseive process
+ // 04-10-2022 Return Early if no reserved keywords are present, this is a very expensive process
$string_hit = false;
foreach ( [':MONTH',':YEAR',':QUARTER',':WEEK'] as $string )
@@ -144,21 +144,21 @@ class Helpers
':QUARTER' => 'Q'.now()->quarter,
':WEEK_BEFORE' => \sprintf(
'%s %s %s',
- Carbon::now()->subDays(7)->translatedFormat($entity->date_format()),
+ Carbon::now()->subDays(6)->translatedFormat($entity->date_format()),
ctrans('texts.to'),
Carbon::now()->translatedFormat($entity->date_format())
),
':WEEK_AHEAD' => \sprintf(
'%s %s %s',
- Carbon::now()->addDays(7)->translatedFormat($entity->date_format()),
+ Carbon::now()->addDays(6)->translatedFormat($entity->date_format()),
ctrans('texts.to'),
- Carbon::now()->addDays(14)->translatedFormat($entity->date_format())
+ Carbon::now()->addDays(13)->translatedFormat($entity->date_format())
),
':WEEK' => \sprintf(
'%s %s %s',
Carbon::now()->translatedFormat($entity->date_format()),
ctrans('texts.to'),
- Carbon::now()->addDays(7)->translatedFormat($entity->date_format())
+ Carbon::now()->addDays(6)->translatedFormat($entity->date_format())
),
],
'raw' => [
diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php
index a022d5e1642e..003d5fb1f79f 100644
--- a/app/Utils/HtmlEngine.php
+++ b/app/Utils/HtmlEngine.php
@@ -124,6 +124,7 @@ class HtmlEngine
$data['$line_tax_labels'] = ['value' => $this->lineTaxLabels(), 'label' => ctrans('texts.taxes')];
$data['$line_tax_values'] = ['value' => $this->lineTaxValues(), 'label' => ctrans('texts.taxes')];
$data['$date'] = ['value' => $this->translateDate($this->entity->date, $this->client->date_format(), $this->client->locale()) ?: ' ', 'label' => ctrans('texts.date')];
+ $data['$status_logo'] = ['value' => '', 'label' => ''];
$data['$invoice.date'] = &$data['$date'];
$data['$invoiceDate'] = &$data['$date'];
@@ -167,6 +168,10 @@ class HtmlEngine
$data['$invoice.project'] = &$data['$project.name'];
}
+ if($this->entity->status_id == 4) {
+ $data['$status_logo'] = ['value' => ' ' . ctrans('texts.paid') .'
', 'label' => ''];
+ }
+
if($this->entity->vendor) {
$data['$invoice.vendor'] = ['value' => $this->entity->vendor->present()->name(), 'label' => ctrans('texts.vendor_name')];
}
diff --git a/database/migrations/2022_11_16_093535_calmness_design.php b/database/migrations/2022_11_16_093535_calmness_design.php
new file mode 100644
index 000000000000..898d96549a87
--- /dev/null
+++ b/database/migrations/2022_11_16_093535_calmness_design.php
@@ -0,0 +1,53 @@
+name = 'Calm';
+ $design->is_custom = false;
+ $design->design = '';
+ $design->is_active = true;
+
+ $design->save();
+ } elseif (Design::count() !== 0) {
+ $design = new Design();
+
+ $design->name = 'Calm';
+ $design->is_custom = false;
+ $design->design = '';
+ $design->is_active = true;
+
+ $design->save();
+ }
+
+ \Illuminate\Support\Facades\Artisan::call('ninja:design-update');
+
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ //
+ }
+};
diff --git a/database/seeders/DesignSeeder.php b/database/seeders/DesignSeeder.php
index fb17cba8ff2e..f1a1fd0ede38 100644
--- a/database/seeders/DesignSeeder.php
+++ b/database/seeders/DesignSeeder.php
@@ -38,6 +38,7 @@ class DesignSeeder extends Seeder
['id' => 8, 'name' => 'Hipster', 'user_id' => null, 'company_id' => null, 'is_custom' => false, 'design' => '', 'is_active' => true],
['id' => 9, 'name' => 'Playful', 'user_id' => null, 'company_id' => null, 'is_custom' => false, 'design' => '', 'is_active' => true],
['id' => 10, 'name' => 'Tech', 'user_id' => null, 'company_id' => null, 'is_custom' => false, 'design' => '', 'is_active' => true],
+ ['id' => 11, 'name' => 'Calm', 'user_id' => null, 'company_id' => null, 'is_custom' => false, 'design' => '', 'is_active' => true],
];
foreach ($designs as $design) {
diff --git a/resources/views/email/template/admin.blade.php b/resources/views/email/template/admin.blade.php
index 82b9df9e55a5..7aecb654c82e 100644
--- a/resources/views/email/template/admin.blade.php
+++ b/resources/views/email/template/admin.blade.php
@@ -101,6 +101,36 @@
#content .center {
text-align: center;
}
+
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ display: inline-block;
+ padding: 0.25rem 1rem;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: fixed;
+ text-align: center;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: fixed;
+ }
diff --git a/resources/views/email/template/client.blade.php b/resources/views/email/template/client.blade.php
index ac4dced9248a..93e772abe888 100644
--- a/resources/views/email/template/client.blade.php
+++ b/resources/views/email/template/client.blade.php
@@ -80,6 +80,33 @@
#content .left {
text-align: left !important;
}
+
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: relative;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: relative;
+ }
-
diff --git a/resources/views/pdf-designs/business.html b/resources/views/pdf-designs/business.html
index fe8285c334ac..d4c0da6f2c44 100644
--- a/resources/views/pdf-designs/business.html
+++ b/resources/views/pdf-designs/business.html
@@ -276,6 +276,36 @@
overflow-wrap: break-word;
}
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ display: inline-block;
+ padding: 0.25rem 1rem;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: fixed;
+ text-align: center;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: fixed;
+ }
+
/** Useful snippets, uncomment to enable. **/
/** Hide company logo **/
diff --git a/resources/views/pdf-designs/calmness.html b/resources/views/pdf-designs/calm.html
similarity index 83%
rename from resources/views/pdf-designs/calmness.html
rename to resources/views/pdf-designs/calm.html
index 2ec356cecf02..bbd8887835ca 100644
--- a/resources/views/pdf-designs/calmness.html
+++ b/resources/views/pdf-designs/calm.html
@@ -262,7 +262,37 @@
}
[data-ref="total_table-public_notes"] { font-weight: normal; }
+ [data-ref="total_table-terms"] { font-weight: normal; }
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ display: inline-block;
+ padding: 0.25rem 1rem;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: fixed;
+ text-align: center;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: fixed;
+ }
/** Useful snippets, uncomment to enable. **/
/** Hide company logo **/
@@ -290,6 +320,7 @@
/** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
+
@@ -371,24 +403,23 @@
-
-
-
\ No newline at end of file
+ });
+
+
\ No newline at end of file
diff --git a/resources/views/pdf-designs/clean.html b/resources/views/pdf-designs/clean.html
index b584d6c6be45..1f9fcebbd282 100644
--- a/resources/views/pdf-designs/clean.html
+++ b/resources/views/pdf-designs/clean.html
@@ -257,6 +257,36 @@
overflow-wrap: break-word;
}
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ display: inline-block;
+ padding: 0.25rem 1rem;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: fixed;
+ text-align: center;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: fixed;
+ }
+
/** Useful snippets, uncomment to enable. **/
/** Hide company logo **/
diff --git a/resources/views/pdf-designs/creative.html b/resources/views/pdf-designs/creative.html
index 4bf969e71715..1f7f6dbe8050 100644
--- a/resources/views/pdf-designs/creative.html
+++ b/resources/views/pdf-designs/creative.html
@@ -229,6 +229,35 @@
overflow-wrap: break-word;
}
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ display: inline-block;
+ padding: 0.25rem 1rem;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: fixed;
+ text-align: center;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: fixed;
+ }
/** Useful snippets, uncomment to enable. **/
/** Hide company logo **/
diff --git a/resources/views/pdf-designs/elegant.html b/resources/views/pdf-designs/elegant.html
index 98b39ca60bba..649160995e15 100644
--- a/resources/views/pdf-designs/elegant.html
+++ b/resources/views/pdf-designs/elegant.html
@@ -233,7 +233,36 @@
max-width: 300px;
overflow-wrap: break-word;
}
-
+
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ display: inline-block;
+ padding: 0.25rem 1rem;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: fixed;
+ text-align: center;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: fixed;
+ }
/** Useful snippets, uncomment to enable. **/
/** Hide company logo **/
diff --git a/resources/views/pdf-designs/hipster.html b/resources/views/pdf-designs/hipster.html
index b14f8c2fe586..d3201b1bc92c 100644
--- a/resources/views/pdf-designs/hipster.html
+++ b/resources/views/pdf-designs/hipster.html
@@ -251,6 +251,35 @@
overflow-wrap: break-word;
}
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ display: inline-block;
+ padding: 0.25rem 1rem;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: fixed;
+ text-align: center;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: fixed;
+ }
/** Useful snippets, uncomment to enable. **/
/** Hide company logo **/
diff --git a/resources/views/pdf-designs/modern.html b/resources/views/pdf-designs/modern.html
index 4dfea2f4daa7..e47ebffd3db4 100644
--- a/resources/views/pdf-designs/modern.html
+++ b/resources/views/pdf-designs/modern.html
@@ -278,6 +278,35 @@
overflow-wrap: break-word;
}
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ display: inline-block;
+ padding: 0.25rem 1rem;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: fixed;
+ text-align: center;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: fixed;
+ }
/** Useful snippets, uncomment to enable. **/
/** Hide company logo **/
diff --git a/resources/views/pdf-designs/plain.html b/resources/views/pdf-designs/plain.html
index 30acac638bfe..a1f2906f6aff 100644
--- a/resources/views/pdf-designs/plain.html
+++ b/resources/views/pdf-designs/plain.html
@@ -221,6 +221,35 @@
overflow-wrap: break-word;
}
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ display: inline-block;
+ padding: 0.25rem 1rem;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: fixed;
+ text-align: center;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: fixed;
+ }
/** Useful snippets, uncomment to enable. **/
/** Hide company logo **/
diff --git a/resources/views/pdf-designs/playful.html b/resources/views/pdf-designs/playful.html
index 4d308a1a645a..84ac8eb6f294 100644
--- a/resources/views/pdf-designs/playful.html
+++ b/resources/views/pdf-designs/playful.html
@@ -293,6 +293,36 @@
max-width: 300px;
overflow-wrap: break-word;
}
+
+ .stamp {
+ transform: rotate(12deg);
+ color: #555;
+ font-size: 3rem;
+ font-weight: 700;
+ border: 0.25rem solid #555;
+ display: inline-block;
+ padding: 0.25rem 1rem;
+ text-transform: uppercase;
+ border-radius: 1rem;
+ font-family: 'Courier';
+ mix-blend-mode: multiply;
+ z-index:200 !important;
+ position: fixed;
+ text-align: center;
+ }
+
+ .is-paid {
+ color: #D23;
+ border: 1rem double #D23;
+ transform: rotate(-5deg);
+ font-size: 6rem;
+ font-family: "Open sans", Helvetica, Arial, sans-serif;
+ border-radius: 0;
+ padding: 0.5rem;
+ opacity: 0.2;
+ z-index:200 !important;
+ position: fixed;
+ }
/** Useful snippets, uncomment to enable. **/
@@ -323,7 +353,7 @@
/** For more info, please check our docs: https://invoiceninja.github.io **/
/** To find out selectors on your own: https://invoiceninja.github.io/docs/custom-fields/#snippets **/
-
+
@@ -335,7 +365,6 @@
-
|
@@ -380,7 +408,7 @@
-
+