Merge pull request #8381 from turbo124/v5-develop

v5.5.94
This commit is contained in:
David Bomba 2023-03-17 10:10:37 +11:00 committed by GitHub
commit a10f06796a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
63 changed files with 794 additions and 92 deletions

View File

@ -1 +1 @@
5.5.93 5.5.94

View File

@ -174,7 +174,9 @@ class CheckData extends Command
CompanyUser::query()->cursor()->each(function ($cu) { CompanyUser::query()->cursor()->each(function ($cu) {
if (CompanyToken::where('user_id', $cu->user_id)->where('company_id', $cu->company_id)->where('is_system', 1)->doesntExist()) { if (CompanyToken::where('user_id', $cu->user_id)->where('company_id', $cu->company_id)->where('is_system', 1)->doesntExist()) {
$this->logMessage("Creating missing company token for user # {$cu->user->id} for company id # {$cu->company->id}"); $this->logMessage("Creating missing company token for user # {$cu->user_id} for company id # {$cu->company_id}");
if($cu->company && $cu->user)
(new CreateCompanyToken($cu->company, $cu->user, 'System'))->handle(); (new CreateCompanyToken($cu->company, $cu->user, 'System'))->handle();
} }
}); });

View File

@ -471,9 +471,12 @@ class CompanySettings extends BaseSettings
public $client_initiated_payments_minimum = 0; public $client_initiated_payments_minimum = 0;
public $client_initiated_payments_recurring = false;
public $sync_invoice_quote_columns = true; public $sync_invoice_quote_columns = true;
public static $casts = [ public static $casts = [
'client_initiated_payments_recurring'=> 'bool',
'client_initiated_payments' => 'bool', 'client_initiated_payments' => 'bool',
'client_initiated_payments_minimum' => 'float', 'client_initiated_payments_minimum' => 'float',
'sync_invoice_quote_columns' => 'bool', 'sync_invoice_quote_columns' => 'bool',

View File

@ -0,0 +1,37 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataMapper\Schedule;
class ScheduleInvoice
{
/**
* Defines the template name
*
* @var string
*/
public string $template = 'schedule_invoice';
/**
* Defines the template name
*
* @var string
*/
public string $entity = '';
/**
* Defines the template name
*
* @var string
*/
public string $entity_id = '';
}

View File

@ -16,6 +16,7 @@ use App\Models\Company;
use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;

View File

@ -14,13 +14,17 @@ namespace App\Events\Invoice;
use App\Models\Company; use App\Models\Company;
use App\Models\Invoice; use App\Models\Invoice;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
/** /**
* Class InvoiceWasCreated. * Class InvoiceWasCreated.
*/ */
class InvoiceWasCreated class InvoiceWasCreated implements ShouldBroadcast
{ {
use SerializesModels; use Dispatchable, InteractsWithSockets, SerializesModels;
/** /**
* @var Invoice * @var Invoice
@ -44,4 +48,15 @@ class InvoiceWasCreated
$this->company = $company; $this->company = $company;
$this->event_vars = $event_vars; $this->event_vars = $event_vars;
} }
/**
* Get the channels the event should broadcast on.
*
* @return PrivateChannel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
} }

View File

@ -276,8 +276,6 @@ class YodleeController extends BaseController
{ {
//this is the main hook we use for notifications //this is the main hook we use for notifications
nlog("data refresh");
nlog($request->all());
return response()->json(['message' => 'Success'], 200); return response()->json(['message' => 'Success'], 200);

View File

@ -12,11 +12,16 @@
namespace App\Http\Controllers\ClientPortal; namespace App\Http\Controllers\ClientPortal;
use App\Utils\Number;
use Illuminate\View\View; use Illuminate\View\View;
use App\DataMapper\InvoiceItem;
use App\Factory\InvoiceFactory;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
use App\Utils\Traits\MakesDates; use App\Utils\Traits\MakesDates;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\Factory;
use App\Repositories\InvoiceRepository;
use App\Http\Requests\ClientPortal\PrePayments\StorePrePaymentRequest;
/** /**
* Class PrePaymentController. * Class PrePaymentController.
@ -33,9 +38,80 @@ class PrePaymentController extends Controller
*/ */
public function index() public function index()
{ {
$data['minimum_amount'] = auth()->guard('contact')->user()->client->getSetting('client_initiated_payments_minimum');
$data['title'] = ctrans('texts.amount'). " " .auth()->guard('contact')->user()->client->currency()->code." (".auth()->guard('contact')->user()->client->currency()->symbol . ")"; $data = [
'title' => ctrans('texts.amount'). " " .auth()->guard('contact')->user()->client->currency()->code." (".auth()->guard('contact')->user()->client->currency()->symbol . ")",
'allows_recurring' => auth()->guard('contact')->user()->client->getSetting('client_initiated_payments_recurring'),
'allows_recurring' => true,
'minimum_amount' => auth()->guard('contact')->user()->client->getSetting('client_initiated_payments_minimum'),
];
return $this->render('pre_payments.index', $data); return $this->render('pre_payments.index', $data);
} }
public function process(StorePrePaymentRequest $request)
{
$invoice = InvoiceFactory::create(auth()->guard('contact')->user()->company_id, auth()->guard('contact')->user()->user_id);
$invoice->due_date = now()->format('Y-m-d');
$invoice->is_proforma = true;
$invoice->client_id = auth()->guard('contact')->user()->client_id;
$line_item = new InvoiceItem();
$line_item->cost = (float)$request->amount;
$line_item->quantity = 1;
$line_item->product_key = ctrans('texts.pre_payment');
$line_item->notes = $request->notes;
$line_item->type_id = '1';
$items = [];
$items[] = $line_item;
$invoice->line_items = $items;
$invoice->number = ctrans('texts.pre_payment') . " " . now()->format('Y-m-d : H:i:s');
$invoice_repo = new InvoiceRepository();
$data = [
'client_id' => $invoice->client_id,
'quantity' => 1,
'date' => now()->format('Y-m-d'),
];
$invoice = $invoice_repo->save($data, $invoice)
->service()
->markSent()
->fillDefaults()
->save();
$total = $invoice->balance;
//format totals
$formatted_total = Number::formatMoney($invoice->amount, auth()->guard('contact')->user()->client);
$payment_methods = auth()->guard('contact')->user()->client->service()->getPaymentMethods($request->amount);
//if there is only one payment method -> lets return straight to the payment page
$invoices = collect();
$invoices->push($invoice);
$invoices->map(function ($invoice) {
$invoice->balance = Number::formatValue($invoice->balance, $invoice->client->currency());
return $invoice;
});
$data = [
'settings' => auth()->guard('contact')->user()->client->getMergedSettings(),
'invoices' => $invoices,
'formatted_total' => $formatted_total,
'payment_methods' => $payment_methods,
'hashed_ids' => $invoices->pluck('hashed_id'),
'total' => $total,
'pre_payment' => true,
];
return $this->render('invoices.payment', $data);
}
} }

View File

@ -11,36 +11,37 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\DataMapper\Analytics\AccountDeleted; use App\Utils\Ninja;
use App\DataMapper\CompanySettings;
use App\Http\Requests\Company\CreateCompanyRequest;
use App\Http\Requests\Company\DefaultCompanyRequest;
use App\Http\Requests\Company\DestroyCompanyRequest;
use App\Http\Requests\Company\EditCompanyRequest;
use App\Http\Requests\Company\ShowCompanyRequest;
use App\Http\Requests\Company\StoreCompanyRequest;
use App\Http\Requests\Company\UpdateCompanyRequest;
use App\Http\Requests\Company\UploadCompanyRequest;
use App\Jobs\Company\CreateCompany;
use App\Jobs\Company\CreateCompanyPaymentTerms;
use App\Jobs\Company\CreateCompanyTaskStatuses;
use App\Jobs\Company\CreateCompanyToken;
use App\Jobs\Mail\NinjaMailerJob;
use App\Jobs\Mail\NinjaMailerObject;
use App\Mail\Company\CompanyDeleted;
use App\Models\Account; use App\Models\Account;
use App\Models\Company; use App\Models\Company;
use App\Models\CompanyUser; use App\Models\CompanyUser;
use App\Repositories\CompanyRepository;
use App\Transformers\CompanyTransformer;
use App\Transformers\CompanyUserTransformer;
use App\Utils\Ninja;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\SavesDocuments;
use App\Utils\Traits\Uploadable;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\Uploadable;
use App\Jobs\Mail\NinjaMailerJob;
use App\DataMapper\CompanySettings;
use App\Jobs\Company\CreateCompany;
use App\Jobs\Mail\NinjaMailerObject;
use App\Mail\Company\CompanyDeleted;
use App\Utils\Traits\SavesDocuments;
use Turbo124\Beacon\Facades\LightLogs; use Turbo124\Beacon\Facades\LightLogs;
use App\Repositories\CompanyRepository;
use Illuminate\Support\Facades\Storage;
use App\Jobs\Company\CreateCompanyToken;
use App\Transformers\CompanyTransformer;
use App\DataMapper\Analytics\AccountDeleted;
use App\Transformers\CompanyUserTransformer;
use Illuminate\Foundation\Bus\DispatchesJobs;
use App\Jobs\Company\CreateCompanyPaymentTerms;
use App\Jobs\Company\CreateCompanyTaskStatuses;
use App\Http\Requests\Company\EditCompanyRequest;
use App\Http\Requests\Company\ShowCompanyRequest;
use App\Http\Requests\Company\StoreCompanyRequest;
use App\Http\Requests\Company\CreateCompanyRequest;
use App\Http\Requests\Company\UpdateCompanyRequest;
use App\Http\Requests\Company\UploadCompanyRequest;
use App\Http\Requests\Company\DefaultCompanyRequest;
use App\Http\Requests\Company\DestroyCompanyRequest;
/** /**
* Class CompanyController. * Class CompanyController.
@ -486,6 +487,12 @@ class CompanyController extends BaseController
$company_user->forceDelete(); $company_user->forceDelete();
}); });
try {
Storage::disk(config('filesystems.default'))->deleteDirectory($company->company_key);
}
catch(\Exception $e) {
}
$account->delete(); $account->delete();
if (Ninja::isHosted()) { if (Ninja::isHosted()) {
@ -494,7 +501,10 @@ class CompanyController extends BaseController
LightLogs::create(new AccountDeleted()) LightLogs::create(new AccountDeleted())
->increment() ->increment()
->queue(); ->batch();
} else { } else {
$company_id = $company->id; $company_id = $company->id;
@ -511,6 +521,12 @@ class CompanyController extends BaseController
$nmo->to_user = auth()->user(); $nmo->to_user = auth()->user();
(new NinjaMailerJob($nmo, true))->handle(); (new NinjaMailerJob($nmo, true))->handle();
try {
Storage::disk(config('filesystems.default'))->deleteDirectory($company->company_key);
} catch(\Exception $e) {
}
$company->delete(); $company->delete();
//If we are deleting the default companies, we'll need to make a new company the default. //If we are deleting the default companies, we'll need to make a new company the default.

View File

@ -38,6 +38,7 @@ class SubdomainController extends BaseController
'beta', 'beta',
'prometh', 'prometh',
'license', 'license',
'socket',
]; ];
public function __construct() public function __construct()

View File

@ -0,0 +1,34 @@
<?php
namespace App\Http\Requests\ClientPortal\PrePayments;
use App\Http\ViewComposers\PortalComposer;
use Illuminate\Foundation\Http\FormRequest;
class StorePrePaymentRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return auth()->guard('contact')->user()->company->enabled_modules & PortalComposer::MODULE_INVOICES;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'notes' => 'required|bail|',
'amount' => 'required|bail|',
];
}
}

View File

@ -138,11 +138,9 @@ class PortalComposer
$data[] = ['title' => ctrans('texts.subscriptions'), 'url' => 'client.subscriptions.index', 'icon' => 'calendar']; $data[] = ['title' => ctrans('texts.subscriptions'), 'url' => 'client.subscriptions.index', 'icon' => 'calendar'];
} }
/* if(property_exists($this->settings, 'client_initiated_payments') && $this->settings->client_initiated_payments) {
if($this->settings->client_initiated_payments) {
$data[] = ['title' => ctrans('texts.pre_payment'), 'url' => 'client.pre_payments.index', 'icon' => 'dollar-sign']; $data[] = ['title' => ctrans('texts.pre_payment'), 'url' => 'client.pre_payments.index', 'icon' => 'dollar-sign'];
} }
*/
return $data; return $data;
} }

View File

@ -77,7 +77,7 @@ class CreateAccount
$sp794f3f->hosted_company_count = config('ninja.quotas.free.max_companies'); $sp794f3f->hosted_company_count = config('ninja.quotas.free.max_companies');
$sp794f3f->account_sms_verified = true; $sp794f3f->account_sms_verified = true;
if (in_array($this->getDomain($this->request['email']), ['givmail.com','yopmail.com','gmail.com', 'hotmail.com', 'outlook.com', 'yahoo.com', 'aol.com', 'mail.ru','brand-app.biz','proton.me','ema-sofia.eu'])) { if (in_array($this->getDomain($this->request['email']), ['givmail.com','yopmail.com','gmail.com', 'hotmail.com', 'outlook.com', 'yahoo.com', 'aol.com', 'mail.ru','brand-app.biz','proton.me','ema-sofia.eu', 'mail.com'])) {
$sp794f3f->account_sms_verified = false; $sp794f3f->account_sms_verified = false;
} }

View File

@ -811,6 +811,10 @@ class Import implements ShouldQueue
$modified['updated_at'] = Carbon::parse($modified['updated_at']); $modified['updated_at'] = Carbon::parse($modified['updated_at']);
} }
if(!array_key_exists('currency_id', $modified) || !$modified['currency_id']) {
$modified['currency_id'] = $this->company->settings->currency_id;
}
$vendor = $vendor_repository->save( $vendor = $vendor_repository->save(
$modified, $modified,
VendorFactory::create( VendorFactory::create(

View File

@ -105,7 +105,7 @@ class WebhookSingle implements ShouldQueue
$resource = new Item($this->entity, $transformer, $this->entity->getEntityType()); $resource = new Item($this->entity, $transformer, $this->entity->getEntityType());
$data = $manager->createData($resource)->toArray(); $data = $manager->createData($resource)->toArray();
$this->postData($subscription, $data, []); $this->postData($subscription, $data, $subscription->headers);
} }
private function postData($subscription, $data, $headers = []) private function postData($subscription, $data, $headers = [])

View File

@ -28,11 +28,13 @@ class PlayStoreRenewSubscription implements ShouldQueue
nlog($notification); nlog($notification);
$in_app_identifier = $event->getSubscriptionIdentifier(); $in_app_identifier = $event->getSubscriptionIdentifier();
MultiDB::findAndSetDbByInappTransactionId($in_app_identifier); $parts = explode("..", $in_app_identifier);
MultiDB::findAndSetDbByInappTransactionId($parts[0]);
$expirationTime = $event->getSubscription()->getExpiryTime(); $expirationTime = $event->getSubscription()->getExpiryTime();
$account = Account::where('inapp_transaction_id', 'like', $in_app_identifier."%")->first(); $account = Account::where('inapp_transaction_id', 'like', $parts[0]."%")->first();
if ($account) { if ($account) {
$account->update(['plan_expires' => Carbon::parse($expirationTime)]); $account->update(['plan_expires' => Carbon::parse($expirationTime)]);

View File

@ -363,9 +363,9 @@ class PaymentEmailEngine extends BaseEmailEngine
/** /**
* generateLabelsAndValues * generateLabelsAndValues
* *
* @return void * @return array
*/ */
public function generateLabelsAndValues() public function generateLabelsAndValues(): array
{ {
$data = []; $data = [];

View File

@ -130,6 +130,10 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmMedium($value) * @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmMedium($value)
* @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmSource($value) * @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmSource($value)
* @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmTerm($value) * @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmTerm($value)
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\BankIntegration> $bank_integrations
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Company> $companies
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyUser> $company_users
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\User> $users
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Account extends BaseModel class Account extends BaseModel

View File

@ -32,6 +32,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope()
* @method static \Illuminate\Database\Eloquent\Builder|BankAccount withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BankAccount withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|BankAccount withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BankAccount withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\BankSubaccount> $bank_subaccounts
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class BankAccount extends BaseModel class BankAccount extends BaseModel

View File

@ -75,6 +75,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|BankIntegration withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|BankIntegration withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\BankTransaction> $transactions
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class BankIntegration extends BaseModel class BankIntegration extends BaseModel

View File

@ -166,6 +166,25 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|Client whereWebsite($value) * @method static \Illuminate\Database\Eloquent\Builder|Client whereWebsite($value)
* @method static \Illuminate\Database\Eloquent\Builder|Client withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Client withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Client withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Client withoutTrashed()
* @property string $payment_balance
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyLedger> $company_ledger
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ClientContact> $contacts
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Credit> $credits
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Expense> $expenses
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ClientGatewayToken> $gateway_tokens
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Invoice> $invoices
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyLedger> $ledger
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Payment> $payments
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ClientContact> $primary_contact
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Project> $projects
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Quote> $quotes
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\RecurringExpense> $recurring_expenses
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\RecurringInvoice> $recurring_invoices
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\SystemLog> $system_logs
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Task> $tasks
* @method static \Illuminate\Database\Eloquent\Builder|Client wherePaymentBalance($value)
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Client extends BaseModel implements HasLocalePreference class Client extends BaseModel implements HasLocalePreference

View File

@ -123,6 +123,11 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|ClientContact whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|ClientContact whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ClientContact withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|ClientContact withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|ClientContact withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|ClientContact withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CreditInvitation> $credit_invitations
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\InvoiceInvitation> $invoice_invitations
* @property-read \Illuminate\Notifications\DatabaseNotificationCollection<int, \Illuminate\Notifications\DatabaseNotification> $notifications
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\QuoteInvitation> $quote_invitations
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\RecurringInvoiceInvitation> $recurring_invoice_invitations
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class ClientContact extends Authenticatable implements HasLocalePreference class ClientContact extends Authenticatable implements HasLocalePreference

View File

@ -282,6 +282,50 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|Company whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Company whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Company whereUseCommaAsDecimalPlace($value) * @method static \Illuminate\Database\Eloquent\Builder|Company whereUseCommaAsDecimalPlace($value)
* @method static \Illuminate\Database\Eloquent\Builder|Company whereUseQuoteTermsOnConversion($value) * @method static \Illuminate\Database\Eloquent\Builder|Company whereUseQuoteTermsOnConversion($value)
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $all_activities
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $all_documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\BankIntegration> $bank_integrations
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\BankTransactionRule> $bank_transaction_rules
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\BankTransaction> $bank_transactions
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ClientContact> $client_contacts
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ClientGatewayToken> $client_gateway_tokens
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Client> $clients
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyGateway> $company_gateways
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyUser> $company_users
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ClientContact> $contacts
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Credit> $credits
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Design> $designs
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ExpenseCategory> $expense_categories
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Expense> $expenses
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\GroupSetting> $group_settings
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\GroupSetting> $groups
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Invoice> $invoices
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyLedger> $ledger
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\PaymentTerm> $payment_terms
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Payment> $payments
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Product> $products
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Project> $projects
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\PurchaseOrder> $purchase_orders
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Quote> $quotes
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\RecurringExpense> $recurring_expenses
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\RecurringInvoice> $recurring_invoices
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Scheduler> $schedulers
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Subscription> $subscriptions
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\SystemLog> $system_log_relation
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\SystemLog> $system_logs
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Scheduler> $task_schedulers
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\TaskStatus> $task_statuses
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Task> $tasks
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\TaxRate> $tax_rates
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyToken> $tokens
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyToken> $tokens_hashed
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Design> $user_designs
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\PaymentTerm> $user_payment_terms
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\User> $users
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Vendor> $vendors
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Webhook> $webhooks
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Company extends BaseModel class Company extends BaseModel

View File

@ -92,6 +92,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ClientGatewayToken> $client_gateway_tokens
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class CompanyGateway extends BaseModel class CompanyGateway extends BaseModel

View File

@ -67,6 +67,9 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|CompanyUser whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|CompanyUser whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|CompanyUser withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|CompanyUser withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|CompanyUser withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|CompanyUser withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyToken> $token
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyToken> $tokens
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\User> $users
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class CompanyUser extends Pivot class CompanyUser extends Pivot

View File

@ -185,6 +185,13 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|Credit whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|Credit whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Credit withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Credit withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Credit withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Credit withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyLedger> $company_ledger
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Backup> $history
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CreditInvitation> $invitations
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Invoice> $invoices
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Payment> $payments
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Credit extends BaseModel class Credit extends BaseModel

View File

@ -130,6 +130,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|Expense whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|Expense whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Expense withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Expense withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Expense withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Expense withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Expense extends BaseModel class Expense extends BaseModel

View File

@ -28,6 +28,7 @@ namespace App\Models;
* @method static \Illuminate\Database\Eloquent\Builder|GatewayType whereAlias($value) * @method static \Illuminate\Database\Eloquent\Builder|GatewayType whereAlias($value)
* @method static \Illuminate\Database\Eloquent\Builder|GatewayType whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|GatewayType whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|GatewayType whereName($value) * @method static \Illuminate\Database\Eloquent\Builder|GatewayType whereName($value)
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\PaymentType> $payment_methods
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class GatewayType extends StaticModel class GatewayType extends StaticModel

View File

@ -54,6 +54,8 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|GroupSetting whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|GroupSetting whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|GroupSetting withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|GroupSetting withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|GroupSetting withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|GroupSetting withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Client> $clients
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class GroupSetting extends StaticModel class GroupSetting extends StaticModel

View File

@ -203,6 +203,15 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|Invoice whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|Invoice whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Invoice withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Invoice withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Invoice withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Invoice withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyLedger> $company_ledger
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Credit> $credits
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Expense> $expenses
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Backup> $history
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\InvoiceInvitation> $invitations
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Payment> $payments
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Task> $tasks
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Invoice extends BaseModel class Invoice extends BaseModel

View File

@ -13,6 +13,43 @@ namespace App\Models;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
/**
* App\Models\License
*
* @property int $id
* @property int|null $created_at
* @property int|null $updated_at
* @property int|null $deleted_at
* @property string|null $first_name
* @property string|null $last_name
* @property string|null $email
* @property string|null $license_key
* @property int|null $is_claimed
* @property string|null $transaction_reference
* @property int|null $product_id
* @property int|null $recurring_invoice_id
* @method static \Illuminate\Database\Eloquent\Builder|StaticModel company()
* @method static \Illuminate\Database\Eloquent\Builder|StaticModel exclude($columns)
* @method static \Illuminate\Database\Eloquent\Builder|License newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|License newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|License onlyTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|License query()
* @method static \Illuminate\Database\Eloquent\Builder|License whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereDeletedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereEmail($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereFirstName($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereIsClaimed($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereLastName($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereLicenseKey($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereProductId($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereRecurringInvoiceId($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereTransactionReference($value)
* @method static \Illuminate\Database\Eloquent\Builder|License whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|License withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|License withoutTrashed()
* @mixin \Eloquent
*/
class License extends StaticModel class License extends StaticModel
{ {
use SoftDeletes; use SoftDeletes;

View File

@ -132,6 +132,11 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|Payment whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|Payment whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Payment withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Payment withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Payment withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Payment withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyLedger> $company_ledger
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Credit> $credits
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Invoice> $invoices
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Paymentable> $paymentables
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Payment extends BaseModel class Payment extends BaseModel

View File

@ -96,6 +96,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|Product whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|Product whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Product withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Product withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Product withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Product withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Product extends BaseModel class Product extends BaseModel

View File

@ -72,6 +72,8 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|Project whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|Project whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Project withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Project withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Project withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Project withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Task> $tasks
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Project extends BaseModel class Project extends BaseModel

View File

@ -28,6 +28,7 @@ use App\Utils\Traits\MakesHash;
* @method static \Illuminate\Database\Eloquent\Builder|Proposal newQuery() * @method static \Illuminate\Database\Eloquent\Builder|Proposal newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Proposal query() * @method static \Illuminate\Database\Eloquent\Builder|Proposal query()
* @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Proposal extends BaseModel class Proposal extends BaseModel

View File

@ -180,6 +180,12 @@ use Illuminate\Support\Facades\Storage;
* @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Backup> $history
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\PurchaseOrderInvitation> $invitations
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Invoice> $invoices
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Payment> $payments
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class PurchaseOrder extends BaseModel class PurchaseOrder extends BaseModel

View File

@ -181,6 +181,10 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|Quote whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|Quote whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Quote withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Quote withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Quote withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Quote withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Backup> $history
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\QuoteInvitation> $invitations
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Quote extends BaseModel class Quote extends BaseModel

View File

@ -139,6 +139,7 @@ use Illuminate\Support\Carbon;
* @method static \Illuminate\Database\Eloquent\Builder|RecurringExpense whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|RecurringExpense whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|RecurringExpense withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|RecurringExpense withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|RecurringExpense withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|RecurringExpense withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class RecurringExpense extends BaseModel class RecurringExpense extends BaseModel

View File

@ -177,6 +177,11 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|RecurringInvoice whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|RecurringInvoice whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|RecurringInvoice withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|RecurringInvoice withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|RecurringInvoice withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|RecurringInvoice withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Backup> $history
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\RecurringInvoiceInvitation> $invitations
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Invoice> $invoices
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class RecurringInvoice extends BaseModel class RecurringInvoice extends BaseModel

View File

@ -171,6 +171,11 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Backup> $history
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\RecurringQuoteInvitation> $invitations
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Quote> $quotes
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class RecurringQuote extends BaseModel class RecurringQuote extends BaseModel

View File

@ -91,6 +91,7 @@ use Illuminate\Support\Carbon;
* @method static \Illuminate\Database\Eloquent\Builder|Task whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|Task whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Task withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Task withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Task withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Task withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Task extends BaseModel class Task extends BaseModel

View File

@ -139,6 +139,13 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|User whereVerifiedPhoneNumber($value) * @method static \Illuminate\Database\Eloquent\Builder|User whereVerifiedPhoneNumber($value)
* @method static \Illuminate\Database\Eloquent\Builder|User withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|User withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|User withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|User withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Client> $clients
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Company> $companies
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyUser> $company_users
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ClientContact> $contacts
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Notifications\DatabaseNotificationCollection<int, \Illuminate\Notifications\DatabaseNotification> $notifications
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\CompanyToken> $tokens
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class User extends Authenticatable implements MustVerifyEmail class User extends Authenticatable implements MustVerifyEmail

View File

@ -104,6 +104,10 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|Vendor whereWebsite($value) * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereWebsite($value)
* @method static \Illuminate\Database\Eloquent\Builder|Vendor withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Vendor withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Vendor withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Vendor withoutTrashed()
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Activity> $activities
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\VendorContact> $contacts
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Document> $documents
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\VendorContact> $primary_contact
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class Vendor extends BaseModel class Vendor extends BaseModel

View File

@ -110,6 +110,8 @@ use Laracasts\Presenter\PresentableTrait;
* @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereVendorId($value)
* @method static \Illuminate\Database\Eloquent\Builder|VendorContact withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|VendorContact withTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|VendorContact withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|VendorContact withoutTrashed()
* @property-read \Illuminate\Notifications\DatabaseNotificationCollection<int, \Illuminate\Notifications\DatabaseNotification> $notifications
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\PurchaseOrderInvitation> $purchase_order_invitations
* @mixin \Eloquent * @mixin \Eloquent
*/ */
class VendorContact extends Authenticatable implements HasLocalePreference class VendorContact extends Authenticatable implements HasLocalePreference

View File

@ -24,7 +24,6 @@ class RouteServiceProvider extends ServiceProvider
{ {
use MakesHash; use MakesHash;
private int $default_rate_limit = 5000;
/** /**
* Define your route model bindings, pattern filters, etc. * Define your route model bindings, pattern filters, etc.
* *

View File

@ -83,6 +83,9 @@ class InvoiceRepository extends BaseRepository
*/ */
public function restore($invoice) :Invoice public function restore($invoice) :Invoice
{ {
if($invoice->is_proforma)
return $invoice;
//if we have just archived, only perform a soft restore //if we have just archived, only perform a soft restore
if (! $invoice->is_deleted) { if (! $invoice->is_deleted) {
parent::restore($invoice); parent::restore($invoice);

View File

@ -214,7 +214,7 @@ class InstantPayment
$credit_totals = 0; $credit_totals = 0;
} }
$hash_data = ['invoices' => $payable_invoices->toArray(), 'credits' => $credit_totals, 'amount_with_fee' => max(0, (($invoice_totals + $fee_totals) - $credit_totals))]; $hash_data = ['invoices' => $payable_invoices->toArray(), 'credits' => $credit_totals, 'amount_with_fee' => max(0, (($invoice_totals + $fee_totals) - $credit_totals)), 'pre_payment' => $this->request->pre_payment];
if ($this->request->query('hash')) { if ($this->request->query('hash')) {
$hash_data['billing_context'] = Cache::get($this->request->query('hash')); $hash_data['billing_context'] = Cache::get($this->request->query('hash'));

View File

@ -168,6 +168,12 @@ class EmailDefaults
*/ */
private function setBody(): self private function setBody(): self
{ {
if ($this->template == 'email.template.custom') {
$this->email->email_object->body = (str_replace('$body', $this->email->email_object->body, $this->email->email_object->settings->email_style_custom));
return $this;
}
if ($this->email->email_object->body) { if ($this->email->email_object->body) {
// A Custom Message has been set in the email screen. // A Custom Message has been set in the email screen.
return $this; return $this;
@ -179,10 +185,6 @@ class EmailDefaults
$this->email->email_object->body = EmailTemplateDefaults::getDefaultTemplate($this->email->email_object->email_template_body, $this->locale); $this->email->email_object->body = EmailTemplateDefaults::getDefaultTemplate($this->email->email_object->email_template_body, $this->locale);
} }
if ($this->template == 'email.template.custom') {
$this->email->email_object->body = (str_replace('$body', $this->email->email_object->body, $this->email->email_object->settings->email_style_custom));
}
return $this; return $this;
} }

View File

@ -39,7 +39,7 @@ class EmailMailable extends Mailable
* @return \Illuminate\Mail\Mailables\Envelope * @return \Illuminate\Mail\Mailables\Envelope
*/ */
public function envelope() public function envelope()
{nlog($this->email_object->cc); {
return new Envelope( return new Envelope(
subject: $this->email_object->subject, subject: $this->email_object->subject,
tags: [$this->email_object->company_key], tags: [$this->email_object->company_key],

View File

@ -82,10 +82,22 @@ class UpdateInvoicePayment
->save(); ->save();
if ($invoice->is_proforma) { if ($invoice->is_proforma) {
if (strlen($invoice->number) > 1 && str_starts_with($invoice->number, "####")) {
$invoice->number = ''; //keep proforma's hidden
if(property_exists($this->payment_hash->data, 'pre_payment') && $this->payment_hash->data->pre_payment == "1"){
$invoice->payments()->each(function ($p) {
$p->pivot->forceDelete();
});
$invoice->is_deleted = true;
$invoice->deleted_at = now();
$invoice->saveQuietly();
return;
} }
if (strlen($invoice->number) > 1 && str_starts_with($invoice->number, "####"))
$invoice->number = '';
$invoice->is_proforma = false; $invoice->is_proforma = false;

View File

@ -683,8 +683,6 @@ class HtmlEngine
$data['labels'][$key.'_label'] = $value['label']; $data['labels'][$key.'_label'] = $value['label'];
} }
// nlog($data);
return $data; return $data;
} }

View File

@ -12,27 +12,28 @@
namespace App\Utils; namespace App\Utils;
use App\DataMapper\EmailTemplateDefaults;
use App\Mail\Engine\PaymentEmailEngine;
use App\Models\Client;
use App\Models\ClientContact;
use App\Models\Invoice;
use App\Models\InvoiceInvitation;
use App\Models\Payment;
use App\Models\PurchaseOrder;
use App\Models\PurchaseOrderInvitation;
use App\Models\Quote;
use App\Models\QuoteInvitation;
use App\Models\Vendor;
use App\Models\VendorContact;
use App\Services\PdfMaker\Designs\Utilities\DesignHelpers;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\MakesInvoiceHtml;
use App\Utils\Traits\MakesTemplateData;
use DB; use DB;
use Illuminate\Support\Facades\App; use App\Models\Quote;
use App\Models\Client;
use App\Models\Vendor;
use App\Models\Invoice;
use App\Models\Payment;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use App\Models\ClientContact;
use App\Models\PurchaseOrder;
use App\Models\VendorContact;
use App\Services\Pdf\PdfMock;
use App\Models\QuoteInvitation;
use App\Utils\Traits\MakesHash;
use App\Models\InvoiceInvitation;
use Illuminate\Support\Facades\App;
use App\Utils\Traits\MakesInvoiceHtml;
use App\Mail\Engine\PaymentEmailEngine;
use App\Models\PurchaseOrderInvitation;
use App\Utils\Traits\MakesTemplateData;
use App\DataMapper\EmailTemplateDefaults;
use League\CommonMark\CommonMarkConverter; use League\CommonMark\CommonMarkConverter;
use App\Services\PdfMaker\Designs\Utilities\DesignHelpers;
class TemplateEngine class TemplateEngine
{ {
@ -96,7 +97,19 @@ class TemplateEngine
if (strlen($this->entity) > 1 && strlen($this->entity_id) > 1) { if (strlen($this->entity) > 1 && strlen($this->entity_id) > 1) {
$class = 'App\Models\\' . ucfirst(Str::camel($this->entity)); $class = 'App\Models\\' . ucfirst(Str::camel($this->entity));
$this->entity_obj = $class::withTrashed()->where('id', $this->decodePrimaryKey($this->entity_id))->company()->first(); $this->entity_obj = $class::withTrashed()->where('id', $this->decodePrimaryKey($this->entity_id))->company()->first();
} else { }
elseif(stripos($this->template, 'quote') !== false && $quote = Quote::whereHas('invitations')->withTrashed()->company()->first()){
$this->entity = 'quote';
$this->entity_obj = $quote;
}
elseif(stripos($this->template, 'purchase') !== false && $purchase_order = PurchaseOrder::whereHas('invitations')->withTrashed()->company()->first()){
$this->entity = 'purchase_order';
$this->entity_obj = $purchase_order;
}
elseif ($invoice = Invoice::whereHas('invitations')->withTrashed()->company()->first()){
$this->entity_obj = $invoice;
}
else {
$this->mockEntity(); $this->mockEntity();
} }
@ -183,6 +196,7 @@ class TemplateEngine
private function entityValues($contact) private function entityValues($contact)
{ {
if (in_array($this->entity, ['purchaseOrder', 'purchase_order'])) { if (in_array($this->entity, ['purchaseOrder', 'purchase_order'])) {
$this->labels_and_values = (new VendorHtmlEngine($this->entity_obj->invitations->first()))->generateLabelsAndValues(); $this->labels_and_values = (new VendorHtmlEngine($this->entity_obj->invitations->first()))->generateLabelsAndValues();
} elseif ($this->entity == 'payment') { } elseif ($this->entity == 'payment') {
@ -323,6 +337,8 @@ class TemplateEngine
'user_id' => auth()->user()->id, 'user_id' => auth()->user()->id,
'company_id' => auth()->user()->company()->id, 'company_id' => auth()->user()->company()->id,
'client_id' => $client->id, 'client_id' => $client->id,
'amount' => '10',
'balance' => '10',
]); ]);
$invitation = InvoiceInvitation::factory()->create([ $invitation = InvoiceInvitation::factory()->create([
@ -391,6 +407,7 @@ class TemplateEngine
$this->entity_obj->load('client'); $this->entity_obj->load('client');
$client->setRelation('company', auth()->user()->company()); $client->setRelation('company', auth()->user()->company());
$client->load('company'); $client->load('company');
} }
} }

View File

@ -511,7 +511,7 @@ class VendorHtmlEngine
$data['values'][$key] = $value['value']; $data['values'][$key] = $value['value'];
$data['labels'][$key.'_label'] = $value['label']; $data['labels'][$key.'_label'] = $value['label'];
} }
nlog($data);
return $data; return $data;
} }

View File

@ -74,7 +74,7 @@
"omnipay/paypal": "^3.0", "omnipay/paypal": "^3.0",
"payfast/payfast-php-sdk": "^1.1", "payfast/payfast-php-sdk": "^1.1",
"pragmarx/google2fa": "^8.0", "pragmarx/google2fa": "^8.0",
"turbo124/predis": "1.1.11", "pusher/pusher-php-server": "^7.2",
"razorpay/razorpay": "2.*", "razorpay/razorpay": "2.*",
"sentry/sentry-laravel": "^3", "sentry/sentry-laravel": "^3",
"setasign/fpdf": "^1.8", "setasign/fpdf": "^1.8",
@ -88,6 +88,7 @@
"symfony/mailgun-mailer": "^6.1", "symfony/mailgun-mailer": "^6.1",
"symfony/postmark-mailer": "^6.1", "symfony/postmark-mailer": "^6.1",
"turbo124/beacon": "^1.4", "turbo124/beacon": "^1.4",
"turbo124/predis": "1.1.11",
"twilio/sdk": "^6.40", "twilio/sdk": "^6.40",
"webpatser/laravel-countries": "dev-master#75992ad", "webpatser/laravel-countries": "dev-master#75992ad",
"wepay/php-sdk": "^0.3" "wepay/php-sdk": "^0.3"

149
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "5aa22a61531e67324395d207a7c94e27", "content-hash": "9f936d7b92dfacb4e28eda9197563c32",
"packages": [ "packages": [
{ {
"name": "afosto/yaac", "name": "afosto/yaac",
@ -6369,6 +6369,92 @@
}, },
"time": "2020-10-15T08:29:30+00:00" "time": "2020-10-15T08:29:30+00:00"
}, },
{
"name": "paragonie/sodium_compat",
"version": "v1.19.0",
"source": {
"type": "git",
"url": "https://github.com/paragonie/sodium_compat.git",
"reference": "cb15e403ecbe6a6cc515f855c310eb6b1872a933"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/cb15e403ecbe6a6cc515f855c310eb6b1872a933",
"reference": "cb15e403ecbe6a6cc515f855c310eb6b1872a933",
"shasum": ""
},
"require": {
"paragonie/random_compat": ">=1",
"php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8"
},
"require-dev": {
"phpunit/phpunit": "^3|^4|^5|^6|^7|^8|^9"
},
"suggest": {
"ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.",
"ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security."
},
"type": "library",
"autoload": {
"files": [
"autoload.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"ISC"
],
"authors": [
{
"name": "Paragon Initiative Enterprises",
"email": "security@paragonie.com"
},
{
"name": "Frank Denis",
"email": "jedisct1@pureftpd.org"
}
],
"description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists",
"keywords": [
"Authentication",
"BLAKE2b",
"ChaCha20",
"ChaCha20-Poly1305",
"Chapoly",
"Curve25519",
"Ed25519",
"EdDSA",
"Edwards-curve Digital Signature Algorithm",
"Elliptic Curve Diffie-Hellman",
"Poly1305",
"Pure-PHP cryptography",
"RFC 7748",
"RFC 8032",
"Salpoly",
"Salsa20",
"X25519",
"XChaCha20-Poly1305",
"XSalsa20-Poly1305",
"Xchacha20",
"Xsalsa20",
"aead",
"cryptography",
"ecdh",
"elliptic curve",
"elliptic curve cryptography",
"encryption",
"libsodium",
"php",
"public-key cryptography",
"secret-key cryptography",
"side-channel resistant"
],
"support": {
"issues": "https://github.com/paragonie/sodium_compat/issues",
"source": "https://github.com/paragonie/sodium_compat/tree/v1.19.0"
},
"time": "2022-09-26T03:40:35+00:00"
},
{ {
"name": "payfast/payfast-php-sdk", "name": "payfast/payfast-php-sdk",
"version": "v1.1.4", "version": "v1.1.4",
@ -7645,6 +7731,67 @@
}, },
"time": "2023-01-29T21:24:40+00:00" "time": "2023-01-29T21:24:40+00:00"
}, },
{
"name": "pusher/pusher-php-server",
"version": "7.2.2",
"source": {
"type": "git",
"url": "https://github.com/pusher/pusher-http-php.git",
"reference": "4ace4873873b06c25cecb2dd6d9fdcbf2f20b640"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/pusher/pusher-http-php/zipball/4ace4873873b06c25cecb2dd6d9fdcbf2f20b640",
"reference": "4ace4873873b06c25cecb2dd6d9fdcbf2f20b640",
"shasum": ""
},
"require": {
"ext-curl": "*",
"ext-json": "*",
"guzzlehttp/guzzle": "^7.2",
"paragonie/sodium_compat": "^1.6",
"php": "^7.3|^8.0",
"psr/log": "^1.0|^2.0|^3.0"
},
"require-dev": {
"overtrue/phplint": "^2.3",
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.0-dev"
}
},
"autoload": {
"psr-4": {
"Pusher\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Library for interacting with the Pusher REST API",
"keywords": [
"events",
"messaging",
"php-pusher-server",
"publish",
"push",
"pusher",
"real time",
"real-time",
"realtime",
"rest",
"trigger"
],
"support": {
"issues": "https://github.com/pusher/pusher-http-php/issues",
"source": "https://github.com/pusher/pusher-http-php/tree/7.2.2"
},
"time": "2022-12-20T19:52:36+00:00"
},
{ {
"name": "ralouphie/getallheaders", "name": "ralouphie/getallheaders",
"version": "3.0.3", "version": "3.0.3",

View File

@ -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.5.93', 'app_version' => '5.5.94',
'app_tag' => '5.5.93', 'app_tag' => '5.5.94',
'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', ''),

View File

@ -110,6 +110,7 @@ class RandomDataSeeder extends Seeder
'account_id' => $account->id, 'account_id' => $account->id,
'name' => 'test token', 'name' => 'test token',
'token' => \Illuminate\Support\Str::random(64), 'token' => \Illuminate\Support\Str::random(64),
'is_system' => 1
]); ]);
$user->companies()->attach($company->id, [ $user->companies()->attach($company->id, [
@ -157,6 +158,7 @@ class RandomDataSeeder extends Seeder
'account_id' => $account->id, 'account_id' => $account->id,
'name' => 'test token', 'name' => 'test token',
'token' => \Illuminate\Support\Str::random(64), 'token' => \Illuminate\Support\Str::random(64),
'is_system' => 1,
]); ]);
$user->companies()->attach($company->id, [ $user->companies()->attach($company->id, [
@ -200,6 +202,7 @@ class RandomDataSeeder extends Seeder
'account_id' => $account->id, 'account_id' => $account->id,
'name' => 'test token', 'name' => 'test token',
'token' => \Illuminate\Support\Str::random(64), 'token' => \Illuminate\Support\Str::random(64),
'is_system' => 1,
]); ]);

View File

@ -5021,6 +5021,7 @@ $LANG = array(
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'pre_payment' => 'Pre Payment', 'pre_payment' => 'Pre Payment',
'client_remaining_cycles_helper' => 'The number of times this invoice will be generated',
); );

View File

@ -13,6 +13,7 @@
<input type="hidden" name="company_gateway_id" id="company_gateway_id"> <input type="hidden" name="company_gateway_id" id="company_gateway_id">
<input type="hidden" name="payment_method_id" id="payment_method_id"> <input type="hidden" name="payment_method_id" id="payment_method_id">
<input type="hidden" name="signature"> <input type="hidden" name="signature">
<input type="hidden" name="pre_payment" value="{{ isset($pre_payment) ? $pre_payment : false }}">
<div class="container mx-auto"> <div class="container mx-auto">
<div class="grid grid-cols-6 gap-4"> <div class="grid grid-cols-6 gap-4">
@ -110,7 +111,6 @@
type="text" type="text"
class="input mt-0 mr-4 relative" class="input mt-0 mr-4 relative"
name="payable_invoices[{{$key}}][amount]" name="payable_invoices[{{$key}}][amount]"
dusk="underpayment-input"
value="{{ $invoice->partial > 0 ? $invoice->partial : $invoice->balance }}"/> value="{{ $invoice->partial > 0 ? $invoice->partial : $invoice->balance }}"/>
</label> </label>
</div> </div>

View File

@ -14,6 +14,18 @@
</div> </div>
<div> <div>
<dl> <dl>
@if(!empty($payment->status_id) && !is_null($payment->status_id))
<div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.status') }}
</dt>
<div class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{!! \App\Models\Payment::badgeForStatus($payment->status_id) !!}
</div>
</div>
@endif
@if(!empty($payment->clientPaymentDate()) && !is_null($payment->clientPaymentDate())) @if(!empty($payment->clientPaymentDate()) && !is_null($payment->clientPaymentDate()))
<div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6"> <div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
<dt class="text-sm font-medium leading-5 text-gray-500"> <dt class="text-sm font-medium leading-5 text-gray-500">
@ -72,14 +84,6 @@
@endif @endif
@if(!empty($payment->status_id) && !is_null($payment->status_id)) @if(!empty($payment->status_id) && !is_null($payment->status_id))
<div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.status') }}
</dt>
<div class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{!! \App\Models\Payment::badgeForStatus($payment->status_id) !!}
</div>
</div>
@if($payment->refunded > 0) @if($payment->refunded > 0)
<div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6"> <div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
@ -91,6 +95,18 @@
</div> </div>
</div> </div>
@endif @endif
@if($payment->applied != $payment->amount)
<div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.remaining') }}
</dt>
<div class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ \App\Utils\Number::formatMoney($payment->amount - $payment->applied, $payment->client) }}
</div>
</div>
@endif
@endif @endif
</dl> </dl>
</div> </div>
@ -107,6 +123,7 @@
<div> <div>
<dl> <dl>
@foreach($payment->invoices as $invoice) @foreach($payment->invoices as $invoice)
@if(!$invoice->is_proforma)
<div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6"> <div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
<dt class="text-sm font-medium leading-5 text-gray-500"> <dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.invoice_number') }} {{ ctrans('texts.invoice_number') }}
@ -119,6 +136,7 @@
- {{ \App\Utils\Number::formatMoney($payment->invoices->where('id', $invoice->id)->sum('pivot.amount') - $payment->invoices->where('id', $invoice->id)->sum('pivot.refunded'), $payment->client) }} - {{ \App\Utils\Number::formatMoney($payment->invoices->where('id', $invoice->id)->sum('pivot.amount') - $payment->invoices->where('id', $invoice->id)->sum('pivot.refunded'), $payment->client) }}
</div> </div>
</div> </div>
@endif
@endforeach @endforeach
</dl> </dl>
</div> </div>

View File

@ -0,0 +1,101 @@
@extends('portal.ninja2020.layout.app')
@section('meta_title', ctrans('texts.pre_payment'))
@push('head')
<style>
[x-cloak] { display: none; }
</style>
@endpush
@section('body')
<form action="{{ route('client.pre_payments.process') }}" method="post" id="payment-form" onkeypress="return event.keyCode != 13;">
@csrf
<input type="hidden" name="company_gateway_id" id="company_gateway_id">
<input type="hidden" name="payment_method_id" id="payment_method_id">
<input type="hidden" name="signature">
<div class="container mx-auto">
<div class="grid grid-cols-6 gap-4">
<div class="col-span-6 md:col-start-2 md:col-span-4">
<div class="flex justify-end">
</div>
<div class="mb-4 overflow-hidden bg-white shadow sm:rounded-lg">
<div class="px-4 py-5 border-b border-gray-200 sm:px-6">
<h3 class="text-lg font-medium leading-6 text-gray-900">
{{ ctrans('texts.payment') }}
</h3>
</div>
@component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.payment_details')])
<textarea name="notes" class="focus:shadow-soft-primary-outline min-h-unset text-sm leading-5.6 ease-soft block h-auto w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-3 py-2 font-normal text-gray-700 outline-none transition-all placeholder:text-gray-500 focus:border-fuchsia-300 focus:outline-none"></textarea>
@if($errors->has('notes'))
<p class="mt-2 text-red-900 border-red-300 px-2 py-1 bg-gray-100">{{ $errors->first('notes') }}</p>
@endif
@endcomponent
@component('portal.ninja2020.components.general.card-element', ['title' => $title])
<input
type="text"
class="input mt-0 mr-4 relative"
name="amount"
placeholder="{{ $minimum_amount }}"
min="{{ $minimum_amount }}"/>
@if($errors->has('amount'))
<p class="mt-2 text-red-900 border-red-300 px-2 py-1 bg-gray-100">{{ $errors->first('amount') }}</p>
@endif
@endcomponent
@if($allows_recurring)
<div x-data="{ show: false }">
@component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.enable_recurring')])
<input x-on:click="show = !show" id="is_recurring" aria-describedby="recurring-description" name="is_recurring" type="checkbox" class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600">
@endcomponent
<div x-cloak x-show="show">
@component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.cycles_remaining')])
<select name="remaining_cycles" class="form-select input w-full bg-white">
<option value="-1" selected>{{ ctrans('texts.freq_indefinitely')}}</option>
@for($i = 1; $i < 60; $i++)
<option value={{$i}}>{{$i}}</option>
@endfor
</select>
<span class="py-2">
<label for="remaining_cycles" class="col-form-label text-center col-lg-3 text-gray-900">{{ ctrans ('texts.client_remaining_cycles_helper')}}</label>
</span>
@endcomponent
@component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.frequency')])
<select name="frequency_id" class="form-select input w-full bg-white">
<option value="1">{{ ctrans('texts.freq_daily') }}</option>
<option value="2">{{ ctrans('texts.freq_weekly') }}</option>
<option value="3">{{ ctrans('texts.freq_two_weeks') }}</option>
<option value="4">{{ ctrans('texts.freq_four_weeks') }}</option>
<option value="5">{{ ctrans('texts.freq_monthly') }}</option>
<option value="6">{{ ctrans('texts.freq_two_months') }}</option>
<option value="7">{{ ctrans('texts.freq_three_months') }}</option>
<option value="8">{{ ctrans('texts.') }}</option>
<option value="9">{{ ctrans('texts.') }}</option>
<option value="10">{{ ctrans('texts.') }}</option>
<option value="11">{{ ctrans('texts.') }}</option>
<option value="12">{{ ctrans('texts.') }}</option>
</select>
@endcomponent
</div>
</div>
@endif
<div class="px-4 py-3 bg-gray-50 text-right sm:px-6" x-data="{ buttonDisabled: false }">
<button class="button button-primary bg-primary"x-on:click="buttonDisabled = true" x-bind:disabled="buttonDisabled">{{ ctrans('texts.pay_now') }}</button>
</div>
</div>
</div>
</div>
</div>
</form>
@endsection

View File

@ -76,6 +76,40 @@
</div> </div>
@endif @endif
<div class="mt-4 overflow-hidden bg-white shadow sm:rounded-lg">
<div class="px-4 py-5 border-b border-gray-200 sm:px-6">
<h3 class="text-lg font-medium leading-6 text-gray-900">
{{ ctrans('texts.invoices') }}
</h3>
</div>
<div>
<dl>
@foreach($invoice->invoices as $inv)
<div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.invoice_number') }}
</dt>
<div class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
<a class="button-link text-primary"
href="{{ route('client.invoice.show', ['invoice' => $inv->hashed_id])}}">
{{ $inv->number }}
</a>
- {{ \App\Utils\Number::formatMoney($inv->amount, $invoice->client) }}
</div>
</div>
@endforeach
</dl>
</div>
@if($invoice->subscription && $invoice->subscription?->allow_cancellation) @if($invoice->subscription && $invoice->subscription?->allow_cancellation)
{{-- INV2-591 --}} {{-- INV2-591 --}}
{{-- @if(false) --}} {{-- @if(false) --}}

View File

@ -68,7 +68,7 @@ Route::group(['middleware' => ['auth:contact', 'locale', 'domain_db','check_clie
Route::get('payments/{payment}', [App\Http\Controllers\ClientPortal\PaymentController::class, 'show'])->name('payments.show'); Route::get('payments/{payment}', [App\Http\Controllers\ClientPortal\PaymentController::class, 'show'])->name('payments.show');
Route::get('pre_payments', [PrePaymentController::class, 'index'])->name('pre_payments.index')->middleware('portal_enabled'); Route::get('pre_payments', [PrePaymentController::class, 'index'])->name('pre_payments.index')->middleware('portal_enabled');
Route::get('pre_payments/process', [PrePaymentController::class, 'process'])->name('pre_payments.process')->middleware('portal_enabled'); Route::post('pre_payments/process', [PrePaymentController::class, 'process'])->name('pre_payments.process')->middleware('portal_enabled');
Route::get('profile/{client_contact}/edit', [App\Http\Controllers\ClientPortal\ProfileController::class, 'edit'])->name('profile.edit'); Route::get('profile/{client_contact}/edit', [App\Http\Controllers\ClientPortal\ProfileController::class, 'edit'])->name('profile.edit');
Route::put('profile/{client_contact}/edit', [App\Http\Controllers\ClientPortal\ProfileController::class, 'update'])->name('profile.update'); Route::put('profile/{client_contact}/edit', [App\Http\Controllers\ClientPortal\ProfileController::class, 'update'])->name('profile.update');