mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-24 02:14:21 -04:00
Merge branch 'v2' into v2-pdfmaker-design-improvements
This commit is contained in:
commit
d508d9b8f2
@ -70,6 +70,31 @@ class DemoMode extends Command
|
||||
{
|
||||
set_time_limit(0);
|
||||
|
||||
$cached_tables = config('ninja.cached_tables');
|
||||
|
||||
foreach ($cached_tables as $name => $class) {
|
||||
if (! Cache::has($name)) {
|
||||
// check that the table exists in case the migration is pending
|
||||
if (! Schema::hasTable((new $class())->getTable())) {
|
||||
continue;
|
||||
}
|
||||
if ($name == 'payment_terms') {
|
||||
$orderBy = 'num_days';
|
||||
} elseif ($name == 'fonts') {
|
||||
$orderBy = 'sort_order';
|
||||
} elseif (in_array($name, ['currencies', 'industries', 'languages', 'countries', 'banks'])) {
|
||||
$orderBy = 'name';
|
||||
} else {
|
||||
$orderBy = 'id';
|
||||
}
|
||||
$tableData = $class::orderBy($orderBy)->get();
|
||||
if ($tableData->count()) {
|
||||
Cache::forever($name, $tableData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$this->info("Migrating");
|
||||
Artisan::call('migrate:fresh --force');
|
||||
|
||||
@ -257,7 +282,7 @@ class DemoMode extends Command
|
||||
'company_id' => $company->id
|
||||
]);
|
||||
|
||||
factory(\App\Models\ClientContact::class, 1)->create([
|
||||
factory(\App\Models\ClientContact::class)->create([
|
||||
'user_id' => $user->id,
|
||||
'client_id' => $client->id,
|
||||
'company_id' => $company->id,
|
||||
@ -301,7 +326,7 @@ class DemoMode extends Command
|
||||
]);
|
||||
|
||||
|
||||
factory(\App\Models\VendorContact::class, 1)->create([
|
||||
factory(\App\Models\VendorContact::class)->create([
|
||||
'user_id' => $client->user->id,
|
||||
'vendor_id' => $vendor->id,
|
||||
'company_id' => $client->company_id,
|
||||
|
@ -151,7 +151,14 @@ class EmailTemplateDefaults
|
||||
|
||||
public static function emailPaymentTemplate()
|
||||
{
|
||||
return Parsedown::instance()->line(self::transformText('payment_message'));
|
||||
$converter = new CommonMarkConverter([
|
||||
'html_input' => 'strip',
|
||||
'allow_unsafe_links' => false,
|
||||
]);
|
||||
|
||||
return $converter->convertToHtml(self::transformText('payment_message'));
|
||||
|
||||
// return Parsedown::instance()->line(self::transformText('payment_message'));
|
||||
}
|
||||
|
||||
public static function emailReminder1Subject()
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
namespace App\Events\Quote;
|
||||
|
||||
use App\Models\ClientContact;
|
||||
use App\Models\Company;
|
||||
use App\Models\Quote;
|
||||
use Illuminate\Broadcasting\Channel;
|
||||
|
110
app/Filters/SystemLogFilters.php
Normal file
110
app/Filters/SystemLogFilters.php
Normal file
@ -0,0 +1,110 @@
|
||||
<?php
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com)
|
||||
*
|
||||
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||
*
|
||||
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
|
||||
*
|
||||
* @license https://opensource.org/licenses/AAL
|
||||
*/
|
||||
|
||||
namespace App\Filters;
|
||||
|
||||
use App\Models\Vendor;
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
/**
|
||||
* SystemLogFilters
|
||||
*/
|
||||
class SystemLogFilters extends QueryFilters
|
||||
{
|
||||
|
||||
public function type_id(int $type_id) :Builder
|
||||
{
|
||||
return $this->builder->where('type_id', $type_id);
|
||||
}
|
||||
|
||||
public function category_id(int $category_id) :Builder
|
||||
{
|
||||
return $this->builder->where('category_id', $category_id);
|
||||
}
|
||||
|
||||
public function event_id(int $event_id) :Builder
|
||||
{
|
||||
return $this->builder->where('event_id', $event_id);
|
||||
}
|
||||
|
||||
public function client_id(int $client_id) :Builder
|
||||
{
|
||||
return $this->builder->where('client_id', $client_id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter based on search text
|
||||
*
|
||||
* @param string query filter
|
||||
* @return Illuminate\Database\Query\Builder
|
||||
* @deprecated
|
||||
*
|
||||
*/
|
||||
public function filter(string $filter = '') : Builder
|
||||
{
|
||||
if (strlen($filter) == 0) {
|
||||
return $this->builder;
|
||||
}
|
||||
|
||||
return $this->builder;
|
||||
|
||||
// return $this->builder->where(function ($query) use ($filter) {
|
||||
// $query->where('vendors.name', 'like', '%'.$filter.'%')
|
||||
// ->orWhere('vendors.id_number', 'like', '%'.$filter.'%')
|
||||
// ->orWhere('vendor_contacts.first_name', 'like', '%'.$filter.'%')
|
||||
// ->orWhere('vendor_contacts.last_name', 'like', '%'.$filter.'%')
|
||||
// ->orWhere('vendor_contacts.email', 'like', '%'.$filter.'%')
|
||||
// ->orWhere('vendors.custom_value1', 'like', '%'.$filter.'%')
|
||||
// ->orWhere('vendors.custom_value2', 'like', '%'.$filter.'%')
|
||||
// ->orWhere('vendors.custom_value3', 'like', '%'.$filter.'%')
|
||||
// ->orWhere('vendors.custom_value4', 'like', '%'.$filter.'%');
|
||||
// });
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts the list based on $sort
|
||||
*
|
||||
* @param string sort formatted as column|asc
|
||||
* @return Illuminate\Database\Query\Builder
|
||||
*/
|
||||
public function sort(string $sort) : Builder
|
||||
{
|
||||
$sort_col = explode("|", $sort);
|
||||
return $this->builder->orderBy($sort_col[0], $sort_col[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the base query
|
||||
*
|
||||
* @param int company_id
|
||||
* @return Illuminate\Database\Query\Builder
|
||||
* @deprecated
|
||||
*/
|
||||
public function baseQuery(int $company_id, User $user) : Builder
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters the query by the users company ID
|
||||
*
|
||||
* @param $company_id The company Id
|
||||
* @return Illuminate\Database\Query\Builder
|
||||
*/
|
||||
public function entityFilter()
|
||||
{
|
||||
|
||||
//return $this->builder->whereCompanyId(auth()->user()->company()->id);
|
||||
return $this->builder->company();
|
||||
}
|
||||
}
|
@ -23,32 +23,6 @@ use Illuminate\Support\Facades\Gate;
|
||||
class VendorFilters extends QueryFilters
|
||||
{
|
||||
|
||||
/**
|
||||
* Filter by balance
|
||||
*
|
||||
* @param string $balance
|
||||
* @return Illuminate\Database\Query\Builder
|
||||
*/
|
||||
public function balance(string $balance): Builder
|
||||
{
|
||||
$parts = $this->split($balance);
|
||||
|
||||
return $this->builder->where('balance', $parts->operator, $parts->value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter between balances
|
||||
*
|
||||
* @param string balance
|
||||
* @return Illuminate\Database\Query\Builder
|
||||
*/
|
||||
public function between_balance(string $balance): Builder
|
||||
{
|
||||
$parts = explode(":", $balance);
|
||||
|
||||
return $this->builder->whereBetween('balance', [$parts[0], $parts[1]]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter based on search text
|
||||
*
|
||||
|
@ -131,7 +131,7 @@ class InvoiceController extends Controller
|
||||
|
||||
//generate pdf's of invoices locally
|
||||
if (!$invoices || $invoices->count() == 0) {
|
||||
return;
|
||||
return back()->with(['message' => ctrans('texts.no_items_selected')]);
|
||||
}
|
||||
|
||||
//if only 1 pdf, output to buffer for download
|
||||
|
@ -146,8 +146,8 @@ class MigrationController extends BaseController
|
||||
public function purgeCompanySaveSettings(Request $request, Company $company)
|
||||
{
|
||||
|
||||
$company->clients()->delete();
|
||||
$company->products()->delete();
|
||||
$company->clients()->forceDelete();
|
||||
$company->products()->forceDelete();
|
||||
|
||||
$company->save();
|
||||
|
||||
|
17
app/Http/Controllers/OpenAPI/SystemLogSchema.php
Normal file
17
app/Http/Controllers/OpenAPI/SystemLogSchema.php
Normal file
@ -0,0 +1,17 @@
|
||||
<?php
|
||||
/**
|
||||
* @OA\Schema(
|
||||
* schema="SystemLog",
|
||||
* type="object",
|
||||
* @OA\Property(property="id", type="string", example="AS3df3A", description="The account hashed id"),
|
||||
* @OA\Property(property="company_id", type="string", example="AS3df3A", description="The company hashed id"),
|
||||
* @OA\Property(property="user_id", type="string", example="AS3df3A", description="The user_id hashed id"),
|
||||
* @OA\Property(property="client_id", type="string", example="AS3df3A", description="The client_id hashed id"),
|
||||
* @OA\Property(property="event_id", type="int", example="1", description="The Log Type ID"),
|
||||
* @OA\Property(property="category_id", type="int", example="1", description="The Category Type ID"),
|
||||
* @OA\Property(property="type_id", type="int", example="1", description="The Type Type ID"),
|
||||
* @OA\Property(property="log", type="object", example="{'key':'value'}", description="The json object of the error"),
|
||||
* @OA\Property(property="updated_at", type="string", example="2", description="______"),
|
||||
* @OA\Property(property="created_at", type="string", example="2", description="______"),
|
||||
* )
|
||||
*/
|
@ -667,7 +667,7 @@ class QuoteController extends BaseController
|
||||
//return response()->download(TempFile::path($quote->pdf_file_path()), basename($quote->pdf_file_path()));
|
||||
break;
|
||||
case 'archive':
|
||||
$this->invoice_repo->archive($quote);
|
||||
$this->quote_repo->archive($quote);
|
||||
return $this->listResponse($quote);
|
||||
break;
|
||||
case 'delete':
|
||||
|
@ -34,7 +34,7 @@ class ProductController extends BaseController
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->first();
|
||||
$company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->firstOrFail();
|
||||
|
||||
if(!$company->enable_shop_api)
|
||||
return response()->json(['message' => 'Shop is disabled', 'errors' => new \stdClass],403);
|
||||
@ -46,7 +46,7 @@ class ProductController extends BaseController
|
||||
|
||||
public function show(Request $request, string $product_key)
|
||||
{
|
||||
$company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->first();
|
||||
$company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->firstOrFail();
|
||||
|
||||
if(!$company->enable_shop_api)
|
||||
return response()->json(['message' => 'Shop is disabled', 'errors' => new \stdClass],403);
|
||||
|
211
app/Http/Controllers/SystemLogController.php
Normal file
211
app/Http/Controllers/SystemLogController.php
Normal file
@ -0,0 +1,211 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Filters\SystemLogFilters;
|
||||
use App\Models\SystemLog;
|
||||
use App\Transformers\SystemLogTransformer;
|
||||
use App\Utils\Traits\MakesHash;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class SystemLogController extends BaseController
|
||||
{
|
||||
|
||||
use MakesHash;
|
||||
|
||||
protected $entity_type = SystemLog::class;
|
||||
|
||||
protected $entity_transformer = SystemLogTransformer::class;
|
||||
|
||||
/**
|
||||
* Show the list of Invoices
|
||||
*
|
||||
* @param \App\Filters\InvoiceFilters $filters The filters
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*
|
||||
* @OA\Get(
|
||||
* path="/api/v1/system_logs",
|
||||
* operationId="getSystemLogs",
|
||||
* tags={"system_logs"},
|
||||
* summary="Gets a list of system logs",
|
||||
* description="Lists system logs, search and filters allow fine grained lists to be generated.
|
||||
*
|
||||
* Query parameters can be added to performed more fine grained filtering of the system logs, these are handled by the SystemLogFilters class which defines the methods available",
|
||||
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||
* @OA\Response(
|
||||
* response=200,
|
||||
* description="A list of system logs",
|
||||
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||
* @OA\JsonContent(ref="#/components/schemas/SystemLog"),
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response=422,
|
||||
* description="Validation error",
|
||||
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response="default",
|
||||
* description="Unexpected Error",
|
||||
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||
* ),
|
||||
* )
|
||||
*
|
||||
*/
|
||||
public function index(SystemLogFilters $filters)
|
||||
{
|
||||
$system_logs = SystemLog::filter($filters);
|
||||
|
||||
return $this->listResponse($system_logs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
$error = [
|
||||
'message' => 'Cannot create system log',
|
||||
'errors' => new \stdClass
|
||||
];
|
||||
|
||||
|
||||
return response()->json($error, 400);
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
|
||||
$error = [
|
||||
'message' => 'Cannot store system log',
|
||||
'errors' => new \stdClass
|
||||
];
|
||||
|
||||
|
||||
return response()->json($error, 400);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param \App\Http\Requests\Invoice\ShowInvoiceRequest $request The request
|
||||
* @param \App\Models\SystemLog $system_logs The system logs
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*
|
||||
*
|
||||
* @OA\Get(
|
||||
* path="/api/v1/system_logs/{id}",
|
||||
* operationId="showSystemLogs",
|
||||
* tags={"system_logs"},
|
||||
* summary="Shows a system_logs",
|
||||
* description="Displays a system_logs by id",
|
||||
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
||||
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||
* @OA\Parameter(
|
||||
* name="id",
|
||||
* in="path",
|
||||
* description="The system_logs Hashed ID",
|
||||
* example="D2J234DFA",
|
||||
* required=true,
|
||||
* @OA\Schema(
|
||||
* type="string",
|
||||
* format="string",
|
||||
* ),
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response=200,
|
||||
* description="Returns the system_logs object",
|
||||
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
||||
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
||||
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
||||
* @OA\JsonContent(ref="#/components/schemas/SystemLog"),
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response=422,
|
||||
* description="Validation error",
|
||||
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
||||
*
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response="default",
|
||||
* description="Unexpected Error",
|
||||
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
||||
* ),
|
||||
* )
|
||||
*
|
||||
*/
|
||||
public function show(Request $request, SystemLog $system_log)
|
||||
{
|
||||
return $this->itemResponse($system_log);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
$error = [
|
||||
'message' => 'Cannot edit system log',
|
||||
'errors' => new \stdClass
|
||||
];
|
||||
|
||||
|
||||
return response()->json($error, 400);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$error = [
|
||||
'message' => 'Cannot update system log',
|
||||
'errors' => new \stdClass
|
||||
];
|
||||
|
||||
|
||||
return response()->json($error, 400);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy($id)
|
||||
{
|
||||
$error = [
|
||||
'message' => 'Cannot destroy system log',
|
||||
'errors' => new \stdClass
|
||||
];
|
||||
|
||||
|
||||
return response()->json($error, 400);
|
||||
}
|
||||
}
|
@ -97,6 +97,10 @@ class CreateInvoicePdf implements ShouldQueue
|
||||
'pdf_variables' => (array)$this->invoice->company->settings->pdf_variables,
|
||||
]),
|
||||
'variables' => $html->generateLabelsAndValues(),
|
||||
'options' => [
|
||||
'all_pages_header' => $this->invoice->client->getSetting('all_pages_header'),
|
||||
'all_pages_footer' => $this->invoice->client->getSetting('all_pages_footer'),
|
||||
],
|
||||
];
|
||||
|
||||
$maker = new PdfMakerService($state);
|
||||
@ -108,6 +112,8 @@ class CreateInvoicePdf implements ShouldQueue
|
||||
//todo - move this to the client creation stage so we don't keep hitting this unnecessarily
|
||||
Storage::makeDirectory($path, 0775);
|
||||
|
||||
info($maker->getCompiledHTML());
|
||||
|
||||
$pdf = $this->makePdf(null, null, $maker->getCompiledHTML());
|
||||
|
||||
$instance = Storage::disk($this->disk)->put($file_path, $pdf);
|
||||
|
@ -97,6 +97,10 @@ class CreateQuotePdf implements ShouldQueue
|
||||
'pdf_variables' => (array)$this->quote->company->settings->pdf_variables,
|
||||
]),
|
||||
'variables' => $html->generateLabelsAndValues(),
|
||||
'options' => [
|
||||
'all_pages_header' => $this->quote->client->getSetting('all_pages_header'),
|
||||
'all_pages_footer' => $this->quote->client->getSetting('all_pages_footer'),
|
||||
],
|
||||
];
|
||||
|
||||
$maker = new PdfMakerService($state);
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Jobs\Util;
|
||||
|
||||
use GuzzleHttp\RequestOptions;
|
||||
use App\Transformers\ArraySerializer;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
@ -24,7 +25,7 @@ class WebhookHandler implements ShouldQueue
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
|
||||
public function __construct($event_id, $entity)
|
||||
{
|
||||
$this->event_id = $event_id;
|
||||
@ -38,11 +39,9 @@ class WebhookHandler implements ShouldQueue
|
||||
*/
|
||||
public function handle() :bool
|
||||
{
|
||||
|
||||
if(!$this->entity->company || $this->entity->company->company_users->first()->is_migrating)
|
||||
return true;
|
||||
|
||||
//info("i got past the check");
|
||||
if(!$this->entity->company || $this->entity->company->company_users->first()->is_migrating == true)
|
||||
return true;
|
||||
|
||||
$subscriptions = \App\Models\Webhook::where('company_id', $this->entity->company_id)
|
||||
->where('event_id', $this->event_id)
|
||||
@ -58,15 +57,15 @@ class WebhookHandler implements ShouldQueue
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
private function process($subscription)
|
||||
{
|
||||
// generate JSON data
|
||||
$manager = new Manager();
|
||||
$manager->setSerializer(new ArraySerializer());
|
||||
// $manager->parseIncludes($include);
|
||||
|
||||
$transformer = new $this->getTransformerClassName();
|
||||
$class = sprintf('App\\Transformers\\%sTransformer', class_basename($this->entity));
|
||||
|
||||
$transformer = new $class();
|
||||
|
||||
$resource = new Item($this->entity, $transformer, $this->entity->getEntityType());
|
||||
$data = $manager->createData($resource)->toArray();
|
||||
@ -74,24 +73,18 @@ class WebhookHandler implements ShouldQueue
|
||||
$this->postData($subscription, $data, []);
|
||||
}
|
||||
|
||||
private function getTransformerClassName()
|
||||
{
|
||||
return sprintf('App\\Transformers\\%sTransformer', class_basename($this->entity));
|
||||
}
|
||||
|
||||
private function postData($subscription, $data, $headers = [])
|
||||
{
|
||||
|
||||
$base_headers = [
|
||||
'Content-Length' => strlen($data),
|
||||
'Content-Length' => strlen(json_encode($data)),
|
||||
'Accept' => 'application/json'
|
||||
];
|
||||
|
||||
$client = new \GuzzleHttp\Client(['headers' => array_merge($base_headers, $headers)]);
|
||||
|
||||
//$response = $client->request('POST', $subscription->target_url, ['form_params' => $data]);
|
||||
|
||||
|
||||
$response = $client->post($subscription->target_url, [
|
||||
GuzzleHttp\RequestOptions::JSON => $data // or 'json' => [...]
|
||||
RequestOptions::JSON => $data // or 'json' => [...]
|
||||
]);
|
||||
|
||||
if ($response->getStatusCode() == 410 || $response->getStatusCode() == 200) {
|
||||
@ -101,7 +94,9 @@ class WebhookHandler implements ShouldQueue
|
||||
|
||||
public function failed($exception)
|
||||
{
|
||||
$exception->getMessage();
|
||||
// etc...
|
||||
|
||||
info(print_r($exception->getMessage(),1));
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -202,6 +202,11 @@ class Client extends BaseModel implements HasLocalePreference
|
||||
return $this->belongsTo(Country::class, 'shipping_country_id', 'id');
|
||||
}
|
||||
|
||||
public function system_logs()
|
||||
{
|
||||
return $this->hasMany(SystemLog::class);
|
||||
}
|
||||
|
||||
public function timezone()
|
||||
{
|
||||
return Timezone::find($this->getSetting('timezone_id'));
|
||||
|
@ -391,6 +391,11 @@ class Company extends BaseModel
|
||||
return $this->hasMany(CompanyToken::class);
|
||||
}
|
||||
|
||||
public function system_logs()
|
||||
{
|
||||
return $this->hasMany(SystemLog::class);
|
||||
}
|
||||
|
||||
public function tokens_hashed()
|
||||
{
|
||||
return $this->hasMany(CompanyToken::class);
|
||||
|
@ -44,6 +44,7 @@ class CompanyGateway extends BaseModel
|
||||
'custom_value3',
|
||||
'custom_value4',
|
||||
'token_billing',
|
||||
'label',
|
||||
];
|
||||
|
||||
public static $credit_cards = [
|
||||
@ -237,10 +238,15 @@ class CompanyGateway extends BaseModel
|
||||
|
||||
public function calcGatewayFee($amount)
|
||||
{
|
||||
if (is_null($this->fees_and_limits)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$fees_and_limits = new \stdClass;
|
||||
|
||||
foreach($this->fees_and_limits as $key => $value)
|
||||
foreach($this->fees_and_limits as $key => $value) {
|
||||
$fees_and_limits = $this->fees_and_limits->{$key};
|
||||
}
|
||||
|
||||
$fee = 0;
|
||||
|
||||
|
@ -11,10 +11,26 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Models\Filterable;
|
||||
use App\Utils\Traits\MakesHash;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
class SystemLog extends Model
|
||||
{
|
||||
use Filterable;
|
||||
use SoftDeletes;
|
||||
use MakesHash;
|
||||
|
||||
protected $casts = [
|
||||
'updated_at' => 'timestamp',
|
||||
'created_at' => 'timestamp',
|
||||
'deleted_at' => 'timestamp',
|
||||
'log' => 'array'
|
||||
];
|
||||
|
||||
protected $dateFormat = 'Y-m-d H:i:s.u';
|
||||
|
||||
/* Category IDs */
|
||||
const CATEGORY_GATEWAY_RESPONSE = 1;
|
||||
const CATEGORY_MAIL = 2;
|
||||
@ -51,7 +67,23 @@ class SystemLog extends Model
|
||||
'type_id',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'log' => 'array'
|
||||
];
|
||||
public function resolveRouteBinding($value)
|
||||
{
|
||||
if (is_numeric($value)) {
|
||||
throw new ModelNotFoundException("Record with value {$value} not found");
|
||||
}
|
||||
|
||||
return $this
|
||||
->where('id', $this->decodePrimaryKey($value))->firstOrFail();
|
||||
}
|
||||
|
||||
/*
|
||||
V2 type of scope
|
||||
*/
|
||||
public function scopeCompany($query)
|
||||
{
|
||||
$query->where('company_id', auth()->user()->companyId());
|
||||
|
||||
return $query;
|
||||
}
|
||||
}
|
||||
|
66
app/Observers/CompanyGatewayObserver.php
Normal file
66
app/Observers/CompanyGatewayObserver.php
Normal file
@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace App\Observers;
|
||||
|
||||
use App\Models\CompanyGateway;
|
||||
|
||||
class CompanyGatewayObserver
|
||||
{
|
||||
/**
|
||||
* Handle the company gateway "created" event.
|
||||
*
|
||||
* @param \App\CompanyGateway $company_gateway
|
||||
* @return void
|
||||
*/
|
||||
public function created(CompanyGateway $company_gateway)
|
||||
{
|
||||
if(!$company_gateway->label){
|
||||
$company_gateway->label = $company_gateway->gateway->name;
|
||||
$company_gateway->save();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the company gateway "updated" event.
|
||||
*
|
||||
* @param \App\CompanyGateway $company_gateway
|
||||
* @return void
|
||||
*/
|
||||
public function updated(CompanyGateway $company_gateway)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the company gateway "deleted" event.
|
||||
*
|
||||
* @param \App\CompanyGateway $company_gateway
|
||||
* @return void
|
||||
*/
|
||||
public function deleted(CompanyGateway $company_gateway)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the company gateway "restored" event.
|
||||
*
|
||||
* @param \App\CompanyGateway $company_gateway
|
||||
* @return void
|
||||
*/
|
||||
public function restored(CompanyGateway $company_gateway)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the company gateway "force deleted" event.
|
||||
*
|
||||
* @param \App\CompanyGateway $company_gateway
|
||||
* @return void
|
||||
*/
|
||||
public function forceDeleted(CompanyGateway $company_gateway)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
@ -15,6 +15,7 @@ use App\Helpers\Language\DecoratedTranslator;
|
||||
use App\Models\Account;
|
||||
use App\Models\Client;
|
||||
use App\Models\Company;
|
||||
use App\Models\CompanyGateway;
|
||||
use App\Models\CompanyToken;
|
||||
use App\Models\Expense;
|
||||
use App\Models\Invoice;
|
||||
@ -26,6 +27,7 @@ use App\Models\Task;
|
||||
use App\Models\User;
|
||||
use App\Observers\AccountObserver;
|
||||
use App\Observers\ClientObserver;
|
||||
use App\Observers\CompanyGatewayObserver;
|
||||
use App\Observers\CompanyObserver;
|
||||
use App\Observers\CompanyTokenObserver;
|
||||
use App\Observers\ExpenseObserver;
|
||||
@ -68,6 +70,7 @@ class AppServiceProvider extends ServiceProvider
|
||||
Account::observe(AccountObserver::class);
|
||||
Client::observe(ClientObserver::class);
|
||||
Company::observe(CompanyObserver::class);
|
||||
CompanyGateway::observe(CompanyGatewayObserver::class);
|
||||
CompanyToken::observe(CompanyTokenObserver::class);
|
||||
Expense::observe(ExpenseObserver::class);
|
||||
Invoice::observe(InvoiceObserver::class);
|
||||
|
@ -180,28 +180,21 @@ class Bold extends BaseDesign
|
||||
|
||||
public function tableFooter()
|
||||
{
|
||||
return [
|
||||
$variables = $this->entity->company->settings->pdf_variables->total_columns;
|
||||
|
||||
$elements = [
|
||||
['element' => 'tr', 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(3)]],
|
||||
['element' => 'td', 'content' => '$subtotal_label', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-4 text-right', 'colspan' => '2']],
|
||||
['element' => 'td', 'content' => '$subtotal', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotalDiscount())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$discount_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$discount', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->partial)], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$partial_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$partial_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotal())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$total_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$total', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'content' => '', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->balance), 'class' => 'mt-8 px-4 py-2'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$balance_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right text-xl text-teal-600 font-semibold', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$balance_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => '100%']],
|
||||
]],
|
||||
];
|
||||
|
||||
foreach ($variables as $variable) {
|
||||
['element' => 'tr', 'properties' => ['hidden' => 'false'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => $variable . '_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => $variable, 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
}
|
||||
}
|
||||
|
@ -186,28 +186,21 @@ class Business extends BaseDesign
|
||||
|
||||
public function tableFooter()
|
||||
{
|
||||
return [
|
||||
$variables = $this->entity->company->settings->pdf_variables->total_columns;
|
||||
|
||||
$elements = [
|
||||
['element' => 'tr', 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(3)]],
|
||||
['element' => 'td', 'content' => '$subtotal_label', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-4 text-right', 'colspan' => '2']],
|
||||
['element' => 'td', 'content' => '$subtotal', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotalDiscount())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$discount_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$discount', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->partial)], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$partial_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$partial_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotal())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$total_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$total', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'content' => '', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->balance), 'class' => 'mt-8 px-4 py-2'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$balance_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right text-xl text-blue-900 font-semibold', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$balance_due', 'properties' => ['class' => 'px-4 py-2 text-right text-blue-900 font-semibold']],
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => '100%']],
|
||||
]],
|
||||
];
|
||||
|
||||
foreach ($variables as $variable) {
|
||||
['element' => 'tr', 'properties' => ['hidden' => 'false'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => $variable . '_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => $variable, 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
}
|
||||
}
|
||||
|
@ -186,28 +186,21 @@ class Clean extends BaseDesign
|
||||
|
||||
public function tableFooter()
|
||||
{
|
||||
return [
|
||||
$variables = $this->entity->company->settings->pdf_variables->total_columns;
|
||||
|
||||
$elements = [
|
||||
['element' => 'tr', 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(3)]],
|
||||
['element' => 'td', 'content' => '$subtotal_label', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-4 text-right', 'colspan' => '2']],
|
||||
['element' => 'td', 'content' => '$subtotal', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotalDiscount())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$discount_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$discount', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->partial), 'class' => 'mt-8 px-4 py-2'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$partial_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$partial_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotal())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$total_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$total', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'content' => '', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->balance), 'class' => 'mt-8 px-4 py-2'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$balance_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right font-semibold', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$balance_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => '100%']],
|
||||
]],
|
||||
];
|
||||
|
||||
foreach ($variables as $variable) {
|
||||
['element' => 'tr', 'properties' => ['hidden' => 'false'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => $variable . '_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => $variable, 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
}
|
||||
}
|
||||
|
@ -186,28 +186,21 @@ class Creative extends BaseDesign
|
||||
|
||||
public function tableFooter()
|
||||
{
|
||||
return [
|
||||
$variables = $this->entity->company->settings->pdf_variables->total_columns;
|
||||
|
||||
$elements = [
|
||||
['element' => 'tr', 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(3)]],
|
||||
['element' => 'td', 'content' => '$subtotal_label', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-4 text-right', 'colspan' => '2']],
|
||||
['element' => 'td', 'content' => '$subtotal', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotalDiscount()), 'class' => 'mt-8 px-4 py-2'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$discount_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$discount', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->partial), 'class' => 'mt-8 px-4 py-2'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$partial_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$partial_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotal())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$total_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$total', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'content' => '', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->balance), 'class' => 'mt-8 px-4 py-2 border-t-4 border-pink-700'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$balance_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$balance_due', 'properties' => ['class' => 'px-4 py-2 text-right font-semibold text-pink-700']],
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => '100%']],
|
||||
]],
|
||||
];
|
||||
|
||||
foreach ($variables as $variable) {
|
||||
['element' => 'tr', 'properties' => ['hidden' => 'false'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => $variable . '_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => $variable, 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
}
|
||||
}
|
||||
|
@ -187,28 +187,21 @@ class Elegant extends BaseDesign
|
||||
|
||||
public function tableFooter()
|
||||
{
|
||||
return [
|
||||
$variables = $this->entity->company->settings->pdf_variables->total_columns;
|
||||
|
||||
$elements = [
|
||||
['element' => 'tr', 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(3)]],
|
||||
['element' => 'td', 'content' => '$subtotal_label', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-4 text-right', 'colspan' => '2']],
|
||||
['element' => 'td', 'content' => '$subtotal', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotalDiscount())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$discount_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$discount', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->partial), 'class' => 'mt-8 px-4 py-2'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$partial_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$partial_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotal())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$total_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$total', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'content' => '', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->balance), 'class' => 'mt-8 px-4 py-2'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$balance_due_label', 'properties' => ['class' => 'px-4 text-right text-xl text-green-600 font-semibold', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$balance_due', 'properties' => ['class' => 'px-4 py-2 text-right text-green-600']],
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => '100%']],
|
||||
]],
|
||||
];
|
||||
|
||||
foreach ($variables as $variable) {
|
||||
['element' => 'tr', 'properties' => ['hidden' => 'false'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => $variable . '_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => $variable, 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
}
|
||||
}
|
||||
|
@ -186,28 +186,21 @@ class Hipster extends BaseDesign
|
||||
|
||||
public function tableFooter()
|
||||
{
|
||||
return [
|
||||
$variables = $this->entity->company->settings->pdf_variables->total_columns;
|
||||
|
||||
$elements = [
|
||||
['element' => 'tr', 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'px-4 py-4 text-rightt', 'colspan' => $this->calculateColspan(3)]],
|
||||
['element' => 'td', 'content' => '$subtotal_label', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-4 text-right', 'colspan' => '2']],
|
||||
['element' => 'td', 'content' => '$subtotal', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'border-l-2 border-black px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotalDiscount())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$discount_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$discount', 'properties' => ['class' => 'border-l-2 border-black px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->partial), 'class' => 'mt-8 px-4 py-2'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$partial_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$partial_due', 'properties' => ['class' => 'border-l-2 border-black px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotal())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$total_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$total', 'properties' => ['class' => 'border-l-2 border-black px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'content' => '', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->balance), 'class' => 'mt-8 px-4 py-2'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$balance_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$balance_due', 'properties' => ['class' => 'border-l-2 border-black px-4 py-2 text-right']],
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'px-4 py-4 text-right', 'colspan' => '100%']],
|
||||
]],
|
||||
];
|
||||
|
||||
foreach ($variables as $variable) {
|
||||
['element' => 'tr', 'properties' => ['hidden' => 'false'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => $variable . '_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => $variable, 'properties' => ['class' => 'border-l-2 border-black px-4 py-2 text-right']],
|
||||
]];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
}
|
||||
}
|
||||
|
@ -160,29 +160,22 @@ class Modern extends BaseDesign
|
||||
|
||||
public function tableFooter()
|
||||
{
|
||||
return [
|
||||
$variables = $this->entity->company->settings->pdf_variables->total_columns;
|
||||
|
||||
$elements = [
|
||||
['element' => 'tr', 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(3)]],
|
||||
['element' => 'td', 'content' => '$subtotal_label', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-4 text-right', 'colspan' => '2']],
|
||||
['element' => 'td', 'content' => '$subtotal', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotalDiscount())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$discount_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$discount', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->partial)], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$partial_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$partial_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotal())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$total_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$total', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'content' => '', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->balance), 'class' => 'mt-8 px-4 py-2 bg-gray-900 text-white text-xl'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$balance_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right font-semibold', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$balance_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => '100%']],
|
||||
]],
|
||||
];
|
||||
|
||||
foreach ($variables as $variable) {
|
||||
['element' => 'tr', 'properties' => ['hidden' => 'false'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => $variable . '_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => $variable, 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
}
|
||||
|
||||
public function companyDetails()
|
||||
|
@ -135,29 +135,22 @@ class Plain extends BaseDesign
|
||||
|
||||
public function tableFooter()
|
||||
{
|
||||
return [
|
||||
$variables = $this->entity->company->settings->pdf_variables->total_columns;
|
||||
|
||||
$elements = [
|
||||
['element' => 'tr', 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 py-4', 'colspan' => $this->calculateColspan(3)]],
|
||||
['element' => 'td', 'content' => '$subtotal_label', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-4 text-right', 'colspan' => '2']],
|
||||
['element' => 'td', 'content' => '$subtotal', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotalDiscount())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$discount_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$discount', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->partial)], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$partial_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$partial_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotal())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$total_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$total', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'content' => '', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->balance), 'class' => 'mt-8 px-4 py-2 bg-gray-300'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$balance_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$balance_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => '100%']],
|
||||
]],
|
||||
];
|
||||
|
||||
foreach ($variables as $variable) {
|
||||
$elements[] = ['element' => 'tr', 'properties' => ['hidden' => 'false'], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => $variable . '_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => $variable, 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
}
|
||||
|
||||
public function buildTableHeader(): array
|
||||
|
@ -186,28 +186,21 @@ class Playful extends BaseDesign
|
||||
|
||||
public function tableFooter()
|
||||
{
|
||||
return [
|
||||
$variables = $this->entity->company->settings->pdf_variables->total_columns;
|
||||
|
||||
$elements = [
|
||||
['element' => 'tr', 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(3)]],
|
||||
['element' => 'td', 'content' => '$subtotal_label', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-4 text-right', 'colspan' => '2']],
|
||||
['element' => 'td', 'content' => '$subtotal', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getSubTotal()), 'class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotalDiscount())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => '$discount_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$discount', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'content' => '', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->partial), 'class' => 'mt-8 px-4 py-2'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$partial_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$partial_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotal())], 'content' => '', 'properties' => ['class' => 'mt-8 px-4 py-2'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$total_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$total', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]],
|
||||
['element' => 'tr', 'content' => '', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->balance), 'class' => 'mt-8 px-4 py-2'], 'elements' => [
|
||||
['element' => 'td', 'content' => '$balance_due_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right font-semibold text-teal-600', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => '$balance_due', 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
['element' => 'td', 'content' => '$entity.public_notes', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => '100%']],
|
||||
]],
|
||||
];
|
||||
|
||||
foreach ($variables as $variable) {
|
||||
$elements[] = ['element' => 'tr', 'properties' => ['hidden' => $this->toggleHiddenProperty($this->entity->calc()->getTotalDiscount())], 'content' => '', 'elements' => [
|
||||
['element' => 'td', 'content' => $variable . '_label', 'properties' => ['class' => 'border-l-4 border-white px-4 text-right', 'colspan' => $this->calculateColspan(1)]],
|
||||
['element' => 'td', 'content' => $variable, 'properties' => ['class' => 'px-4 py-2 text-right']],
|
||||
]];
|
||||
}
|
||||
|
||||
return $elements;
|
||||
}
|
||||
}
|
||||
|
@ -32,9 +32,15 @@ class PdfMaker
|
||||
'<?xml version="1.0" encoding="utf-8" standalone="yes"??>' => '',
|
||||
];
|
||||
|
||||
private $options;
|
||||
|
||||
public function __construct(array $data)
|
||||
{
|
||||
$this->data = $data;
|
||||
|
||||
if (array_key_exists('options', $data)) {
|
||||
$this->options = $data['options'];
|
||||
}
|
||||
}
|
||||
|
||||
public function design(string $design)
|
||||
@ -56,6 +62,8 @@ class PdfMaker
|
||||
$this->updateVariables($this->data['variables']);
|
||||
}
|
||||
|
||||
$this->processOptions();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
@ -63,12 +71,12 @@ class PdfMaker
|
||||
{
|
||||
if ($final) {
|
||||
$html = $this->document->saveXML();
|
||||
|
||||
|
||||
$filtered = strtr($html, $this->filters);
|
||||
|
||||
|
||||
return $filtered;
|
||||
}
|
||||
|
||||
|
||||
return $this->document->saveXML();
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,7 @@
|
||||
namespace App\Services\PdfMaker;
|
||||
|
||||
use DOMDocument;
|
||||
use DOMDomError;
|
||||
use DOMXPath;
|
||||
|
||||
trait PdfMakerUtilities
|
||||
@ -47,7 +48,11 @@ trait PdfMakerUtilities
|
||||
public function updateElementProperties(array $elements)
|
||||
{
|
||||
foreach ($elements as $element) {
|
||||
$node = $this->document->getElementById($element['id']);
|
||||
if (isset($element['tag'])) {
|
||||
$node = $this->document->getElementsByTagName($element['tag'])->item(0);
|
||||
} else {
|
||||
$node = $this->document->getElementById($element['id']);
|
||||
}
|
||||
|
||||
if (isset($element['properties'])) {
|
||||
foreach ($element['properties'] as $property => $value) {
|
||||
@ -104,7 +109,6 @@ trait PdfMakerUtilities
|
||||
public function createElementContent($element, $children)
|
||||
{
|
||||
foreach ($children as $child) {
|
||||
|
||||
$_child = $this->document->createElement($child['element'], $child['content']);
|
||||
$element->appendChild($_child);
|
||||
|
||||
@ -149,4 +153,134 @@ trait PdfMakerUtilities
|
||||
|
||||
return $element;
|
||||
}
|
||||
|
||||
public function processOptions()
|
||||
{
|
||||
if (!isset($this->options['all_pages_header']) && !isset($this->options['all_pages_footer'])) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->insertPrintCSS();
|
||||
$this->wrapIntoTable();
|
||||
}
|
||||
|
||||
public function insertPrintCSS()
|
||||
{
|
||||
$css = <<<EOT
|
||||
table.page-container {
|
||||
page-break-after: always;
|
||||
}
|
||||
|
||||
thead.page-header {
|
||||
display: table-header-group;
|
||||
}
|
||||
|
||||
tfoot.page-footer {
|
||||
display: table-footer-group;
|
||||
}
|
||||
EOT;
|
||||
|
||||
$css_node = $this->document->createTextNode($css);
|
||||
|
||||
$style = $this->document->getElementsByTagName('style')->item(0);
|
||||
|
||||
if ($style) {
|
||||
return $style->appendChild($css_node);
|
||||
}
|
||||
|
||||
$head = $this->document->getElementsByTagName('head')->item(0);
|
||||
|
||||
if ($head) {
|
||||
$style_node = $this->document->createElement('style', $css);
|
||||
|
||||
return $head->appendChild($style_node);
|
||||
}
|
||||
}
|
||||
|
||||
public function wrapIntoTable()
|
||||
{
|
||||
$markup = <<<EOT
|
||||
<table class="page-container" id="page-container">
|
||||
<thead class="page-report">
|
||||
<tr>
|
||||
<th class="page-report-cell" id="repeat-header">
|
||||
<!-- Repeating header goes here.. -->
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tfoot class="report-footer">
|
||||
<tr>
|
||||
<td class="report-footer-cell" id="repeat-footer">
|
||||
<!-- Repeating footer goes here -->
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
<tbody class="report-content">
|
||||
<tr>
|
||||
<td class="report-content-cell" id="repeat-content">
|
||||
<!-- Rest of the content goes here -->
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
EOT;
|
||||
|
||||
$document = new DOMDocument();
|
||||
$document->loadHTML($markup);
|
||||
|
||||
$table = $document->getElementById('page-container');
|
||||
|
||||
$body = $this->document->getElementsByTagName('body')
|
||||
->item(0);
|
||||
|
||||
$body->appendChild(
|
||||
$this->document->importNode($table, true)
|
||||
);
|
||||
|
||||
for ($i = 0; $i < $body->childNodes->length; $i++) {
|
||||
$element = $body->childNodes->item($i);
|
||||
|
||||
if ($element->nodeType !== 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (
|
||||
$element->getAttribute('id') == 'header' ||
|
||||
$element->getAttribute('id') == 'footer' ||
|
||||
$element->getAttribute('id') === 'page-container'
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$clone = $element->cloneNode(true);
|
||||
$element->parentNode->removeChild($element);
|
||||
|
||||
$this->document->getElementById('repeat-content')->appendChild($clone);
|
||||
}
|
||||
|
||||
if (
|
||||
$header = $this->document->getElementById('header') &&
|
||||
isset($this->data['options']['all_pages_header']) &&
|
||||
$this->data['options']['all_pages_header']
|
||||
) {
|
||||
|
||||
$header = $this->document->getElementById('header');
|
||||
$clone = $header->cloneNode(true);
|
||||
|
||||
$header->parentNode->removeChild($header);
|
||||
$this->document->getElementById('repeat-header')->appendChild($clone);
|
||||
}
|
||||
|
||||
if (
|
||||
$footer = $this->document->getElementById('footer') &&
|
||||
isset($this->data['options']['all_pages_footer']) &&
|
||||
$this->data['options']['all_pages_footer']
|
||||
) {
|
||||
$footer = $this->document->getElementById('footer');
|
||||
$clone = $footer->cloneNode(true);
|
||||
|
||||
$footer->parentNode->removeChild($footer);
|
||||
$this->document->getElementById('repeat-footer')->appendChild($clone);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -17,10 +17,12 @@ use App\Models\ClientContact;
|
||||
use App\Models\ClientGatewayToken;
|
||||
use App\Models\CompanyLedger;
|
||||
use App\Models\Document;
|
||||
use App\Models\SystemLog;
|
||||
use App\Transformers\ActivityTransformer;
|
||||
use App\Transformers\ClientGatewayTokenTransformer;
|
||||
use App\Transformers\CompanyLedgerTransformer;
|
||||
use App\Transformers\DocumentTransformer;
|
||||
use App\Transformers\SystemLogTransformer;
|
||||
use App\Utils\Traits\MakesHash;
|
||||
|
||||
/**
|
||||
@ -44,6 +46,7 @@ class ClientTransformer extends EntityTransformer
|
||||
'gateway_tokens',
|
||||
'activities',
|
||||
'ledger',
|
||||
'system_logs',
|
||||
];
|
||||
|
||||
|
||||
@ -91,6 +94,14 @@ class ClientTransformer extends EntityTransformer
|
||||
|
||||
return $this->includeCollection($client->ledger, $transformer, CompanyLedger::class);
|
||||
}
|
||||
|
||||
public function includeSystemLogs(Client $client)
|
||||
{
|
||||
$transformer = new SystemLogTransformer($this->serializer);
|
||||
|
||||
return $this->includeCollection($client->system_logs, $transformer, SystemLog::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Client $client
|
||||
*
|
||||
|
@ -27,7 +27,6 @@ class CompanyGatewayTransformer extends EntityTransformer
|
||||
* @var array
|
||||
*/
|
||||
protected $defaultIncludes = [
|
||||
'gateway'
|
||||
];
|
||||
|
||||
/**
|
||||
@ -63,6 +62,8 @@ class CompanyGatewayTransformer extends EntityTransformer
|
||||
'custom_value2' => $company_gateway->custom_value2 ?: '',
|
||||
'custom_value3' => $company_gateway->custom_value3 ?: '',
|
||||
'custom_value4' => $company_gateway->custom_value4 ?: '',
|
||||
'label' => (string)$company_gateway->label ?: '',
|
||||
'token_billing' => (string)$company_gateway->token_billing,
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -29,8 +29,9 @@ use App\Models\PaymentTerm;
|
||||
use App\Models\Product;
|
||||
use App\Models\Project;
|
||||
use App\Models\Quote;
|
||||
use App\Models\SystemLog;
|
||||
use App\Models\Task;
|
||||
use App\Models\TaxRate;
|
||||
use App\Models\TaxRate;
|
||||
use App\Models\User;
|
||||
use App\Models\Webhook;
|
||||
use App\Transformers\CompanyLedgerTransformer;
|
||||
@ -39,6 +40,7 @@ use App\Transformers\CompanyTokenTransformer;
|
||||
use App\Transformers\CreditTransformer;
|
||||
use App\Transformers\DocumentTransformer;
|
||||
use App\Transformers\PaymentTermTransformer;
|
||||
use App\Transformers\SystemLogTransformer;
|
||||
use App\Transformers\TaskTransformer;
|
||||
use App\Transformers\WebhookTransformer;
|
||||
use App\Utils\Traits\MakesHash;
|
||||
@ -88,7 +90,8 @@ class CompanyTransformer extends EntityTransformer
|
||||
'ledger',
|
||||
'webhooks',
|
||||
'tokens',
|
||||
'tokens_hashed'
|
||||
'tokens_hashed',
|
||||
'system_logs',
|
||||
];
|
||||
|
||||
|
||||
@ -307,4 +310,11 @@ class CompanyTransformer extends EntityTransformer
|
||||
|
||||
return $this->includeCollection($company->payment_terms()->get(), $transformer, PaymentTerm::class);
|
||||
}
|
||||
|
||||
public function includeSystemLogs(Company $company)
|
||||
{
|
||||
$transformer = new SystemLogTransformer($this->serializer);
|
||||
|
||||
return $this->includeCollection($company->system_logs, $transformer, SystemLog::class);
|
||||
}
|
||||
}
|
||||
|
39
app/Transformers/SystemLogTransformer.php
Normal file
39
app/Transformers/SystemLogTransformer.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace App\Transformers;
|
||||
|
||||
use App\Models\SystemLog;
|
||||
use App\Utils\Traits\MakesHash;
|
||||
|
||||
class SystemLogTransformer extends EntityTransformer
|
||||
{
|
||||
use MakesHash;
|
||||
|
||||
protected $defaultIncludes = [];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $availableIncludes = [];
|
||||
|
||||
/**
|
||||
* @param Activity $system_log
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function transform(SystemLog $system_log)
|
||||
{
|
||||
return [
|
||||
'id' => (string) $this->encodePrimaryKey($system_log->id),
|
||||
'company_id' => (string) $this->encodePrimaryKey($system_log->company_id),
|
||||
'user_id' => (string) $this->encodePrimaryKey($system_log->user_id),
|
||||
'client_id' => (string) $this->encodePrimaryKey($system_log->client_id),
|
||||
'event_id' => (int) $system_log->event_id,
|
||||
'category_id' => (int) $system_log->category_id,
|
||||
'type_id' => (int) $system_log->type_id,
|
||||
'log' => json_encode($system_log->log),
|
||||
'updated_at' => (int)$system_log->updated_at,
|
||||
'created_at' => (int)$system_log->created_at,
|
||||
];
|
||||
}
|
||||
}
|
@ -95,8 +95,8 @@ class HtmlEngine
|
||||
}
|
||||
|
||||
$data = [];
|
||||
$data['$global-margin'] = ['value' => 'm-12', 'label' => ''];
|
||||
$data['$global-padding'] = ['value' => 'p-12', 'label' => ''];
|
||||
$data['$global-margin'] = ['value' => 'm-8', 'label' => ''];
|
||||
$data['$global-padding'] = ['value' => 'p-8', 'label' => ''];
|
||||
$data['$tax'] = ['value' => '', 'label' => ctrans('texts.tax')];
|
||||
$data['$app_url'] = ['value' => $this->generateAppUrl(), 'label' => ''];
|
||||
$data['$from'] = ['value' => '', 'label' => ctrans('texts.from')];
|
||||
@ -122,8 +122,8 @@ class HtmlEngine
|
||||
$data['$number'] = ['value' => $this->entity->number ?: ' ', 'label' => ctrans('texts.invoice_number')];
|
||||
$data['$entity.terms'] = ['value' => $this->entity->terms ?: ' ', 'label' => ctrans('texts.invoice_terms')];
|
||||
$data['$terms'] = &$data['$entity.terms'];
|
||||
// $data['$view_link'] = ['value' => '<a href="' .$this->invitation->getLink() .'">'. ctrans('texts.view_invoice').'</a>', 'label' => ctrans('texts.view_invoice')];
|
||||
$data['$view_link'] = ['value' => $this->invitation->getLink(), 'label' => ctrans('texts.view_invoice')];
|
||||
$data['$view_link'] = ['value' => '<a href="' .$this->invitation->getLink() .'">'. ctrans('texts.view_invoice').'</a>', 'label' => ctrans('texts.view_invoice')];
|
||||
// $data['$view_link'] = ['value' => $this->invitation->getLink(), 'label' => ctrans('texts.view_invoice')];
|
||||
|
||||
}
|
||||
|
||||
@ -132,8 +132,8 @@ class HtmlEngine
|
||||
$data['$number'] = ['value' => $this->entity->number ?: ' ', 'label' => ctrans('texts.quote_number')];
|
||||
$data['$entity.terms'] = ['value' => $this->entity->terms ?: ' ', 'label' => ctrans('texts.quote_terms')];
|
||||
$data['$terms'] = &$data['$entity.terms'];
|
||||
// $data['$view_link'] = ['value' => '<a href="' .$this->invitation->getLink() .'">'. ctrans('texts.view_quote').'</a>', 'label' => ctrans('texts.view_quote')];
|
||||
$data['$view_link'] = ['value' => $this->invitation->getLink(), 'label' => ctrans('texts.view_quote')];
|
||||
$data['$view_link'] = ['value' => '<a href="' .$this->invitation->getLink() .'">'. ctrans('texts.view_quote').'</a>', 'label' => ctrans('texts.view_quote')];
|
||||
// $data['$view_link'] = ['value' => $this->invitation->getLink(), 'label' => ctrans('texts.view_quote')];
|
||||
}
|
||||
|
||||
if ($this->entity_string == 'credit') {
|
||||
@ -141,8 +141,8 @@ class HtmlEngine
|
||||
$data['$number'] = ['value' => $this->entity->number ?: ' ', 'label' => ctrans('texts.credit_number')];
|
||||
$data['$entity.terms'] = ['value' => $this->entity->terms ?: ' ', 'label' => ctrans('texts.credit_terms')];
|
||||
$data['$terms'] = &$data['$entity.terms'];
|
||||
// $data['$view_link'] = ['value' => '<a href="' .$this->invitation->getLink() .'">'. ctrans('texts.view_credit').'</a>', 'label' => ctrans('texts.view_credit')];
|
||||
$data['$view_link'] = ['value' => $this->invitation->getLink(), 'label' => ctrans('texts.view_credit')];
|
||||
$data['$view_link'] = ['value' => '<a href="' .$this->invitation->getLink() .'">'. ctrans('texts.view_credit').'</a>', 'label' => ctrans('texts.view_credit')];
|
||||
// $data['$view_link'] = ['value' => $this->invitation->getLink(), 'label' => ctrans('texts.view_credit')];
|
||||
}
|
||||
|
||||
$data['$entity_number'] = &$data['$number'];
|
||||
|
@ -215,8 +215,8 @@ trait MakesInvoiceValues
|
||||
$data['$number'] = ['value' => $this->number ?: ' ', 'label' => ctrans('texts.invoice_number')];
|
||||
$data['$entity.terms'] = ['value' => $this->terms ?: ' ', 'label' => ctrans('texts.invoice_terms')];
|
||||
$data['$terms'] = &$data['$entity.terms'];
|
||||
//$data['$view_link'] = ['value' => '<a href="' .$invitation->getLink() .'">'. ctrans('texts.view_invoice').'</a>', 'label' => ctrans('texts.view_invoice')];
|
||||
$data['$view_link'] = ['value' => $invitation->getLink(), 'label' => ctrans('texts.view_invoice')];
|
||||
$data['$view_link'] = ['value' => '<a href="' .$invitation->getLink() .'">'. ctrans('texts.view_invoice').'</a>', 'label' => ctrans('texts.view_invoice')];
|
||||
// $data['$view_link'] = ['value' => $invitation->getLink(), 'label' => ctrans('texts.view_invoice')];
|
||||
}
|
||||
|
||||
if ($this instanceof Quote) {
|
||||
@ -224,8 +224,8 @@ trait MakesInvoiceValues
|
||||
$data['$number'] = ['value' => $this->number ?: ' ', 'label' => ctrans('texts.quote_number')];
|
||||
$data['$entity.terms'] = ['value' => $this->terms ?: ' ', 'label' => ctrans('texts.quote_terms')];
|
||||
$data['$terms'] = &$data['$entity.terms'];
|
||||
// $data['$view_link'] = ['value' => '<a href="' .$invitation->getLink() .'">'. ctrans('texts.view_quote').'</a>', 'label' => ctrans('texts.view_quote')];
|
||||
$data['$view_link'] = ['value' => $invitation->getLink(), 'label' => ctrans('texts.view_quote')];
|
||||
$data['$view_link'] = ['value' => '<a href="' .$invitation->getLink() .'">'. ctrans('texts.view_quote').'</a>', 'label' => ctrans('texts.view_quote')];
|
||||
// $data['$view_link'] = ['value' => $invitation->getLink(), 'label' => ctrans('texts.view_quote')];
|
||||
}
|
||||
|
||||
if ($this instanceof Credit) {
|
||||
@ -233,8 +233,8 @@ trait MakesInvoiceValues
|
||||
$data['$number'] = ['value' => $this->number ?: ' ', 'label' => ctrans('texts.credit_number')];
|
||||
$data['$entity.terms'] = ['value' => $this->terms ?: ' ', 'label' => ctrans('texts.credit_terms')];
|
||||
$data['$terms'] = &$data['$entity.terms'];
|
||||
// $data['$view_link'] = ['value' => '<a href="' .$invitation->getLink() .'">'. ctrans('texts.view_credit').'</a>', 'label' => ctrans('texts.view_credit')];
|
||||
$data['$view_link'] = ['value' => $invitation->getLink(), 'label' => ctrans('texts.view_credit')];
|
||||
$data['$view_link'] = ['value' => '<a href="' .$invitation->getLink() .'">'. ctrans('texts.view_credit').'</a>', 'label' => ctrans('texts.view_credit')];
|
||||
// $data['$view_link'] = ['value' => $invitation->getLink(), 'label' => ctrans('texts.view_credit')];
|
||||
}
|
||||
|
||||
$data['$entity_number'] = &$data['$number'];
|
||||
|
@ -481,7 +481,7 @@ class CreateUsersTable extends Migration
|
||||
$t->boolean('custom_surcharge_tax3')->default(false);
|
||||
$t->boolean('custom_surcharge_tax4')->default(false);
|
||||
|
||||
$t->decimal('exchange_rate', 16, 4);
|
||||
$t->decimal('exchange_rate', 13, 6)->default(1);
|
||||
$t->decimal('amount', 16, 4);
|
||||
$t->decimal('balance', 16, 4);
|
||||
$t->decimal('partial', 16, 4)->nullable();
|
||||
@ -559,7 +559,7 @@ class CreateUsersTable extends Migration
|
||||
$t->boolean('custom_surcharge_tax3')->default(false);
|
||||
$t->boolean('custom_surcharge_tax4')->default(false);
|
||||
|
||||
$t->decimal('exchange_rate', 16, 4);
|
||||
$t->decimal('exchange_rate', 13, 6)->default(1);
|
||||
$t->decimal('amount', 16, 4);
|
||||
$t->decimal('balance', 16, 4);
|
||||
$t->decimal('partial', 16, 4)->nullable();
|
||||
@ -803,7 +803,7 @@ class CreateUsersTable extends Migration
|
||||
$t->boolean('custom_surcharge_tax3')->default(false);
|
||||
$t->boolean('custom_surcharge_tax4')->default(false);
|
||||
|
||||
$t->decimal('exchange_rate', 16, 4);
|
||||
$t->decimal('exchange_rate', 13, 6)->default(1);
|
||||
$t->decimal('amount', 16, 4);
|
||||
$t->decimal('balance', 16, 4);
|
||||
$t->decimal('partial', 16, 4)->nullable();
|
||||
@ -964,7 +964,7 @@ class CreateUsersTable extends Migration
|
||||
$t->softDeletes('deleted_at', 6);
|
||||
$t->boolean('is_deleted')->default(false);
|
||||
$t->boolean('is_manual')->default(false);
|
||||
$t->decimal('exchange_rate', 16, 6)->default(1);
|
||||
$t->decimal('exchange_rate', 13, 6)->default(1);
|
||||
$t->unsignedInteger('currency_id');
|
||||
$t->unsignedInteger('exchange_currency_id');
|
||||
|
||||
@ -1297,7 +1297,7 @@ class CreateUsersTable extends Migration
|
||||
$table->boolean('is_deleted')->default(false);
|
||||
$table->decimal('amount', 13, 2);
|
||||
$table->decimal('foreign_amount', 13, 2);
|
||||
$table->decimal('exchange_rate', 13, 4);
|
||||
$table->decimal('exchange_rate', 13, 6)->default(1);
|
||||
$table->string('tax_name1')->nullable();
|
||||
$table->decimal('tax_rate1', 13, 3)->default(0);
|
||||
$table->string('tax_name2')->nullable();
|
||||
|
@ -24,7 +24,18 @@ class AddIsPublicToDocumentsTable extends Migration
|
||||
|
||||
Schema::table('company_gateways', function (Blueprint $table) {
|
||||
$table->enum('token_billing', ['off', 'always','optin','optout'])->default('off');
|
||||
$table->string('label', 255)->nullable();
|
||||
});
|
||||
|
||||
Schema::table('payments', function (Blueprint $table) {
|
||||
$table->text('meta')->nullable();
|
||||
});
|
||||
|
||||
Schema::table('system_logs', function (Blueprint $table) {
|
||||
$table->softDeletes('deleted_at', 6);
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
256
package-lock.json
generated
256
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -4611,32 +4611,6 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
cached_network_image
|
||||
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 Rene Floor
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
charcode
|
||||
dart_style
|
||||
@ -6108,32 +6082,6 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
flutter_cache_manager
|
||||
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2017 Rene Floor
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
flutter_colorpicker
|
||||
|
||||
@ -7890,6 +7838,30 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
--------------------------------------------------------------------------------
|
||||
harfbuzz
|
||||
|
||||
Copyright (C) 2011 Google, Inc.
|
||||
|
||||
This is part of HarfBuzz, a text shaping library.
|
||||
|
||||
Permission is hereby granted, without written agreement and without
|
||||
license or royalty fees, to use, copy, modify, and distribute this
|
||||
software and its documentation for any purpose, provided that the
|
||||
above copyright notice and the following two paragraphs appear in
|
||||
all copies of this software.
|
||||
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
|
||||
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
|
||||
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
||||
|
||||
THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
||||
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
|
||||
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
--------------------------------------------------------------------------------
|
||||
harfbuzz
|
||||
|
||||
Copyright (C) 2012 Grigori Goronzy <greg@kinoho.net>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
@ -7906,6 +7878,30 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
--------------------------------------------------------------------------------
|
||||
harfbuzz
|
||||
|
||||
Copyright (C) 2013 Google, Inc.
|
||||
|
||||
This is part of HarfBuzz, a text shaping library.
|
||||
|
||||
Permission is hereby granted, without written agreement and without
|
||||
license or royalty fees, to use, copy, modify, and distribute this
|
||||
software and its documentation for any purpose, provided that the
|
||||
above copyright notice and the following two paragraphs appear in
|
||||
all copies of this software.
|
||||
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
|
||||
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
|
||||
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
||||
|
||||
THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
||||
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
|
||||
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
--------------------------------------------------------------------------------
|
||||
harfbuzz
|
||||
|
||||
Copyright © 1998-2004 David Turner and Werner Lemberg
|
||||
Copyright © 2004,2007,2009 Red Hat, Inc.
|
||||
Copyright © 2011,2012 Google, Inc.
|
||||
@ -8186,6 +8182,32 @@ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
--------------------------------------------------------------------------------
|
||||
harfbuzz
|
||||
|
||||
Copyright © 2007,2008,2009 Red Hat, Inc.
|
||||
Copyright © 2018,2019,2020 Ebrahim Byagowi
|
||||
Copyright © 2018 Khaled Hosny
|
||||
|
||||
This is part of HarfBuzz, a text shaping library.
|
||||
|
||||
Permission is hereby granted, without written agreement and without
|
||||
license or royalty fees, to use, copy, modify, and distribute this
|
||||
software and its documentation for any purpose, provided that the
|
||||
above copyright notice and the following two paragraphs appear in
|
||||
all copies of this software.
|
||||
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
|
||||
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
|
||||
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
||||
|
||||
THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
||||
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
|
||||
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
--------------------------------------------------------------------------------
|
||||
harfbuzz
|
||||
|
||||
Copyright © 2007,2008,2009,2010 Red Hat, Inc.
|
||||
Copyright © 2010,2012 Google, Inc.
|
||||
|
||||
@ -9571,7 +9593,7 @@ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
harfbuzz
|
||||
|
||||
Copyright © 2018 Ebrahim Byagowi
|
||||
Copyright © 2018 Khaled Hosny
|
||||
Copyright © 2020 Google, Inc.
|
||||
|
||||
This is part of HarfBuzz, a text shaping library.
|
||||
|
||||
@ -9837,12 +9859,85 @@ PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
--------------------------------------------------------------------------------
|
||||
harfbuzz
|
||||
|
||||
Copyright © 2019-2020 Ebrahim Byagowi
|
||||
|
||||
This is part of HarfBuzz, a text shaping library.
|
||||
|
||||
Permission is hereby granted, without written agreement and without
|
||||
license or royalty fees, to use, copy, modify, and distribute this
|
||||
software and its documentation for any purpose, provided that the
|
||||
above copyright notice and the following two paragraphs appear in
|
||||
all copies of this software.
|
||||
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
|
||||
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
|
||||
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
||||
|
||||
THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
||||
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
|
||||
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
--------------------------------------------------------------------------------
|
||||
harfbuzz
|
||||
|
||||
Copyright © 2020 Ebrahim Byagowi
|
||||
|
||||
This is part of HarfBuzz, a text shaping library.
|
||||
|
||||
Permission is hereby granted, without written agreement and without
|
||||
license or royalty fees, to use, copy, modify, and distribute this
|
||||
software and its documentation for any purpose, provided that the
|
||||
above copyright notice and the following two paragraphs appear in
|
||||
all copies of this software.
|
||||
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
|
||||
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
|
||||
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
||||
|
||||
THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
||||
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
|
||||
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
--------------------------------------------------------------------------------
|
||||
harfbuzz
|
||||
|
||||
Copyright © 2020 Google, Inc.
|
||||
|
||||
This is part of HarfBuzz, a text shaping library.
|
||||
|
||||
Permission is hereby granted, without written agreement and without
|
||||
license or royalty fees, to use, copy, modify, and distribute this
|
||||
software and its documentation for any purpose, provided that the
|
||||
above copyright notice and the following two paragraphs appear in
|
||||
all copies of this software.
|
||||
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
|
||||
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
||||
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
|
||||
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGE.
|
||||
|
||||
THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
|
||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
||||
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
|
||||
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
--------------------------------------------------------------------------------
|
||||
harfbuzz
|
||||
|
||||
HarfBuzz is licensed under the so-called "Old MIT" license. Details follow.
|
||||
For parts of HarfBuzz that are licensed under different licenses see individual
|
||||
files names COPYING in subdirectories where applicable.
|
||||
|
||||
Copyright © 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019 Google, Inc.
|
||||
Copyright © 2019 Facebook, Inc.
|
||||
Copyright © 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020 Google, Inc.
|
||||
Copyright © 2018,2019,2020 Ebrahim Byagowi
|
||||
Copyright © 2019,2020 Facebook, Inc.
|
||||
Copyright © 2012 Mozilla Foundation
|
||||
Copyright © 2011 Codethink Limited
|
||||
Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies)
|
||||
@ -15645,7 +15740,7 @@ wasmer
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 Wasmer, Inc. and its affiliates.
|
||||
Copyright (c) 2019-present Wasmer, Inc. and its affiliates.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
2
public/css/app.css
vendored
2
public/css/app.css
vendored
File diff suppressed because one or more lines are too long
8
public/flutter_service_worker.js
vendored
8
public/flutter_service_worker.js
vendored
@ -3,7 +3,7 @@ const MANIFEST = 'flutter-app-manifest';
|
||||
const TEMP = 'flutter-temp-cache';
|
||||
const CACHE_NAME = 'flutter-app-cache';
|
||||
const RESOURCES = {
|
||||
"main.dart.js": "e612ccff69eca8d814a0172d6d87d301",
|
||||
"main.dart.js": "3a5391955070c7845ca7187ccfba0a2f",
|
||||
"/": "e65799be52f7bbcaf39d78046726b95a",
|
||||
"manifest.json": "77215c1737c7639764e64a192be2f7b8",
|
||||
"assets/FontManifest.json": "6f5928614863ec2a06894a117283ee48",
|
||||
@ -13,7 +13,7 @@ const RESOURCES = {
|
||||
"assets/packages/font_awesome_flutter/lib/fonts/fa-brands-400.ttf": "5a37ae808cf9f652198acde612b5328d",
|
||||
"assets/packages/font_awesome_flutter/lib/fonts/fa-solid-900.ttf": "2aa350bd2aeab88b601a593f793734c0",
|
||||
"assets/AssetManifest.json": "178db3af31496d99657040f3f3434b5a",
|
||||
"assets/NOTICES": "e1d88f597181887c21289669d20aaf75",
|
||||
"assets/NOTICES": "63bfe8452797d29679431def208599fb",
|
||||
"assets/assets/images/logo.png": "090f69e23311a4b6d851b3880ae52541",
|
||||
"assets/assets/images/payment_types/other.png": "d936e11fa3884b8c9f1bd5c914be8629",
|
||||
"assets/assets/images/payment_types/switch.png": "4fa11c45327f5fdc20205821b2cfd9cc",
|
||||
@ -47,8 +47,8 @@ const CORE = [
|
||||
self.addEventListener("install", (event) => {
|
||||
return event.waitUntil(
|
||||
caches.open(TEMP).then((cache) => {
|
||||
// Provide a 'reload' param to ensure the latest version is downloaded.
|
||||
return cache.addAll(CORE.map((value) => new Request(value, {'cache': 'reload'})));
|
||||
return cache.addAll(
|
||||
CORE.map((value) => new Request(value + '?revision=' + RESOURCES[value], {'cache': 'reload'})));
|
||||
})
|
||||
);
|
||||
});
|
||||
|
2
public/js/app.js
vendored
2
public/js/app.js
vendored
File diff suppressed because one or more lines are too long
@ -1,2 +1,2 @@
|
||||
/*! For license information please see action-selectors.js.LICENSE.txt */
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=5)}({5:function(e,t,n){e.exports=n("Boob")},Boob:function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(new(function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.parentElement=document.querySelector(".form-check-parent"),this.parentForm=document.getElementById("bulkActions")}var t,r,o;return t=e,(r=[{key:"watchCheckboxes",value:function(e){var t=this;document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})),document.querySelectorAll(".form-check-child").forEach((function(n){e.checked?(n.checked=e.checked,t.processChildItem(n,document.getElementById("bulkActions"))):(n.checked=!1,document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})))}))}},{key:"processChildItem",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(n.hasOwnProperty("single")&&document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})),!1!==e.checked){var r=document.createElement("INPUT");r.setAttribute("name","invoices[]"),r.setAttribute("value",e.dataset.value),r.setAttribute("class","child-hidden-input"),r.hidden=!0,t.append(r)}else{var o=document.querySelectorAll("input.child-hidden-input"),c=!0,u=!1,l=void 0;try{for(var i,a=o[Symbol.iterator]();!(c=(i=a.next()).done);c=!0){var d=i.value;d.value==e.dataset.value&&d.remove()}}catch(e){u=!0,l=e}finally{try{c||null==a.return||a.return()}finally{if(u)throw l}}}}},{key:"handle",value:function(){var e=this;this.parentElement.addEventListener("click",(function(){e.watchCheckboxes(e.parentElement)}));var t=!0,n=!1,r=void 0;try{for(var o,c=function(){var t=o.value;t.addEventListener("click",(function(){e.processChildItem(t,e.parentForm)}))},u=document.querySelectorAll(".form-check-child")[Symbol.iterator]();!(t=(o=u.next()).done);t=!0)c()}catch(e){n=!0,r=e}finally{try{t||null==u.return||u.return()}finally{if(n)throw r}}}}])&&n(t.prototype,r),o&&n(t,o),e}())).handle()}});
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=5)}({5:function(e,t,n){e.exports=n("Boob")},Boob:function(e,t){function n(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0,c=function(){};return{s:c,n:function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var u,i=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return i=e.done,e},e:function(e){l=!0,u=e},f:function(){try{i||null==n.return||n.return()}finally{if(l)throw u}}}}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function o(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(new(function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.parentElement=document.querySelector(".form-check-parent"),this.parentForm=document.getElementById("bulkActions")}var t,r,c;return t=e,(r=[{key:"watchCheckboxes",value:function(e){var t=this;document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})),document.querySelectorAll(".form-check-child").forEach((function(n){e.checked?(n.checked=e.checked,t.processChildItem(n,document.getElementById("bulkActions"))):(n.checked=!1,document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})))}))}},{key:"processChildItem",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(r.hasOwnProperty("single")&&document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})),!1!==e.checked){var o=document.createElement("INPUT");o.setAttribute("name","invoices[]"),o.setAttribute("value",e.dataset.value),o.setAttribute("class","child-hidden-input"),o.hidden=!0,t.append(o)}else{var c,u=document.querySelectorAll("input.child-hidden-input"),i=n(u);try{for(i.s();!(c=i.n()).done;){var l=c.value;l.value==e.dataset.value&&l.remove()}}catch(e){i.e(e)}finally{i.f()}}}},{key:"handle",value:function(){var e=this;this.parentElement.addEventListener("click",(function(){e.watchCheckboxes(e.parentElement)}));var t,r=n(document.querySelectorAll(".form-check-child"));try{var o=function(){var n=t.value;n.addEventListener("click",(function(){e.processChildItem(n,e.parentForm)}))};for(r.s();!(t=r.n()).done;)o()}catch(e){r.e(e)}finally{r.f()}}}])&&o(t.prototype,r),c&&o(t,c),e}())).handle()}});
|
@ -1,2 +1,2 @@
|
||||
/*! For license information please see authorize-ach.js.LICENSE.txt */
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=4)}({4:function(e,t,n){e.exports=n("UWWK")},UWWK:function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}(new(function(){function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),r(this,"setupStripe",(function(){return t.stripe=Stripe(t.key),t})),r(this,"getFormData",(function(){return{country:document.getElementById("country").value,currency:document.getElementById("currency").value,routing_number:document.getElementById("routing-number").value,account_number:document.getElementById("account-number").value,account_holder_name:document.getElementById("account-holder-name").value,account_holder_type:document.querySelector('input[name="account-holder-type"]:checked').value}})),r(this,"handleError",(function(e){t.errors.textContent="",t.errors.textContent=e,t.errors.hidden=!1})),r(this,"handleSuccess",(function(e){document.getElementById("gateway_response").value=JSON.stringify(e),document.getElementById("server_response").submit()})),r(this,"handleSubmit",(function(e){e.preventDefault(),t.errors.textContent="",t.errors.hidden=!0,t.stripe.createToken("bank_account",t.getFormData()).then((function(e){return e.hasOwnProperty("error")?t.handleError(e.error.message):t.handleSuccess(e)}))})),this.errors=document.getElementById("errors"),this.key=document.querySelector('meta[name="stripe-publishable-key"]').content}var t,o,u;return t=e,(o=[{key:"handle",value:function(){var e=this;document.getElementById("token-form").addEventListener("submit",(function(t){return e.handleSubmit(t)}))}}])&&n(t.prototype,o),u&&n(t,u),e}())).setupStripe().handle()}});
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=4)}({4:function(e,t,n){e.exports=n("UWWK")},UWWK:function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}(new(function(){function e(){var t=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),r(this,"setupStripe",(function(){return t.stripe=Stripe(t.key),t})),r(this,"getFormData",(function(){return{country:document.getElementById("country").value,currency:document.getElementById("currency").value,routing_number:document.getElementById("routing-number").value,account_number:document.getElementById("account-number").value,account_holder_name:document.getElementById("account-holder-name").value,account_holder_type:document.querySelector('input[name="account-holder-type"]:checked').value}})),r(this,"handleError",(function(e){processingOverlay(!1),document.getElementById("save-button").disabled=!1,t.errors.textContent="",t.errors.textContent=e,t.errors.hidden=!1})),r(this,"handleSuccess",(function(e){document.getElementById("gateway_response").value=JSON.stringify(e),document.getElementById("server_response").submit()})),r(this,"handleSubmit",(function(e){processingOverlay(!0),document.getElementById("save-button").disabled=!0,e.preventDefault(),t.errors.textContent="",t.errors.hidden=!0,t.stripe.createToken("bank_account",t.getFormData()).then((function(e){return e.hasOwnProperty("error")?t.handleError(e.error.message):t.handleSuccess(e)}))})),this.errors=document.getElementById("errors"),this.key=document.querySelector('meta[name="stripe-publishable-key"]').content}var t,o,u;return t=e,(o=[{key:"handle",value:function(){var e=this;document.getElementById("token-form").addEventListener("submit",(function(t){return e.handleSubmit(t)}))}}])&&n(t.prototype,o),u&&n(t,u),e}())).setupStripe().handle()}});
|
@ -1,2 +1,2 @@
|
||||
/*! For license information please see authorize-authorize-card.js.LICENSE.txt */
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=2)}({2:function(e,t,n){e.exports=n("6vDv")},"6vDv":function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}new(function(){function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.publicKey=t,this.loginId=n,this.cardHolderName=document.getElementById("cardholder_name"),this.cardButton=document.getElementById("card_button")}var t,r,a;return t=e,(r=[{key:"handleAuthorization",value:function(){var e=$("#my-card"),t={};t.clientKey=this.publicKey,t.apiLoginID=this.loginId;var n={};n.cardNumber=e.CardJs("cardNumber"),n.month=e.CardJs("expiryMonth"),n.year=e.CardJs("expiryYear"),n.cardCode=document.getElementById("cvv").value;var r={};return r.authData=t,r.cardData=n,Accept.dispatchData(r,this.responseHandler),!1}},{key:"responseHandler",value:function(e){if("Error"===e.messages.resultCode)for(var t=0;t<e.messages.message.length;)console.log(e.messages.message[t].code+": "+e.messages.message[t].text),t+=1;else"Ok"===e.messages.resultCode&&(document.getElementById("dataDescriptor").value=e.opaqueData.dataDescriptor,document.getElementById("dataValue").value=e.opaqueData.dataValue,document.getElementById("server_response").submit());return!1}},{key:"handle",value:function(){var e=this;return this.cardButton.addEventListener("click",(function(){e.cardButton.disabled=!e.cardButton.disabled,e.handleAuthorization()})),this}}])&&n(t.prototype,r),a&&n(t,a),e}())(document.querySelector('meta[name="authorize-public-key"]').content,document.querySelector('meta[name="authorize-login-id"]').content).handle()}});
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=2)}({2:function(e,t,n){e.exports=n("6vDv")},"6vDv":function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}new(function(){function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.publicKey=t,this.loginId=n,this.cardHolderName=document.getElementById("cardholder_name"),this.cardButton=document.getElementById("card_button")}var t,r,a;return t=e,(r=[{key:"handleAuthorization",value:function(){var e=$("#my-card"),t={};t.clientKey=this.publicKey,t.apiLoginID=this.loginId;var n={};n.cardNumber=e.CardJs("cardNumber"),n.month=e.CardJs("expiryMonth"),n.year=e.CardJs("expiryYear"),n.cardCode=document.getElementById("cvv").value;var r={};return r.authData=t,r.cardData=n,processingOverlay(!0),Accept.dispatchData(r,this.responseHandler),!1}},{key:"responseHandler",value:function(e){if(processingOverlay(!1),"Error"===e.messages.resultCode)for(var t=0;t<e.messages.message.length;)console.log(e.messages.message[t].code+": "+e.messages.message[t].text),t+=1;else"Ok"===e.messages.resultCode&&(document.getElementById("dataDescriptor").value=e.opaqueData.dataDescriptor,document.getElementById("dataValue").value=e.opaqueData.dataValue,document.getElementById("server_response").submit());return!1}},{key:"handle",value:function(){var e=this;return this.cardButton.addEventListener("click",(function(){e.cardButton.disabled=!e.cardButton.disabled,e.handleAuthorization()})),this}}])&&n(t.prototype,r),a&&n(t,a),e}())(document.querySelector('meta[name="authorize-public-key"]').content,document.querySelector('meta[name="authorize-login-id"]').content).handle()}});
|
@ -1,2 +1,2 @@
|
||||
/*! For license information please see authorize-stripe-card.js.LICENSE.txt */
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var u=t[r]={i:r,l:!1,exports:{}};return e[r].call(u.exports,u,u.exports,n),u.l=!0,u.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var u in e)n.d(r,u,function(t){return e[t]}.bind(null,u));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=1)}({1:function(e,t,n){e.exports=n("jzun")},jzun:function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}new(function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.key=t,this.cardHolderName=document.getElementById("cardholder-name"),this.cardButton=document.getElementById("card-button"),this.clientSecret=this.cardButton.dataset.secret}var t,r,u;return t=e,(r=[{key:"setupStripe",value:function(){return this.stripe=Stripe(this.key),this.elements=this.stripe.elements(),this}},{key:"createElement",value:function(){return this.cardElement=this.elements.create("card"),this}},{key:"mountCardElement",value:function(){return this.cardElement.mount("#card-element"),this}},{key:"handleStripe",value:function(e,t){var n=this;e.handleCardSetup(this.clientSecret,this.cardElement,{payment_method_data:{billing_details:{name:t.value}}}).then((function(e){return e.error?n.handleFailure(e):n.handleSuccess(e)}))}},{key:"handleFailure",value:function(e){var t=document.getElementById("errors");t.textContent="",t.textContent=e.error.message,t.hidden=!1}},{key:"handleSuccess",value:function(e){document.getElementById("gateway_response").value=JSON.stringify(e.setupIntent),document.getElementById("is_default").value=document.getElementById("proxy_is_default").checked,document.getElementById("server_response").submit()}},{key:"handle",value:function(){var e=this;return this.setupStripe().createElement().mountCardElement(),this.cardButton.addEventListener("click",(function(){e.handleStripe(e.stripe,e.cardHolderName)})),this}}])&&n(t.prototype,r),u&&n(t,u),e}())(document.querySelector('meta[name="stripe-publishable-key"]').content).handle()}});
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=1)}({1:function(e,t,n){e.exports=n("jzun")},jzun:function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}new(function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.key=t,this.cardHolderName=document.getElementById("cardholder-name"),this.cardButton=document.getElementById("card-button"),this.clientSecret=this.cardButton.dataset.secret}var t,r,a;return t=e,(r=[{key:"setupStripe",value:function(){return this.stripe=Stripe(this.key),this.elements=this.stripe.elements(),this}},{key:"createElement",value:function(){return this.cardElement=this.elements.create("card"),this}},{key:"mountCardElement",value:function(){return this.cardElement.mount("#card-element"),this}},{key:"handleStripe",value:function(e,t){var n=this;processingOverlay(!0),this.cardButton.disabled=!0,e.handleCardSetup(this.clientSecret,this.cardElement,{payment_method_data:{billing_details:{name:t.value}}}).then((function(e){return e.error?n.handleFailure(e):n.handleSuccess(e)}))}},{key:"handleFailure",value:function(e){processingOverlay(!1),this.cardButton.disabled=!1;var t=document.getElementById("errors");t.textContent="",t.textContent=e.error.message,t.hidden=!1}},{key:"handleSuccess",value:function(e){document.getElementById("gateway_response").value=JSON.stringify(e.setupIntent),document.getElementById("is_default").value=document.getElementById("proxy_is_default").checked,processingOverlay(!1),document.getElementById("server_response").submit()}},{key:"handle",value:function(){var e=this;return this.setupStripe().createElement().mountCardElement(),this.cardButton.addEventListener("click",(function(){e.handleStripe(e.stripe,e.cardHolderName)})),this}}])&&n(t.prototype,r),a&&n(t,a),e}())(document.querySelector('meta[name="stripe-publishable-key"]').content).handle()}});
|
2
public/js/clients/payments/alipay.js
vendored
2
public/js/clients/payments/alipay.js
vendored
@ -1,2 +1,2 @@
|
||||
/*! For license information please see alipay.js.LICENSE.txt */
|
||||
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/",r(r.s=8)}({8:function(e,t,r){e.exports=r("HToU")},HToU:function(e,t){function r(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}new function e(t){var n=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),r(this,"setupStripe",(function(){return n.stripe=Stripe(n.key),n})),r(this,"handle",(function(){var e={type:"alipay",amount:document.querySelector('meta[name="amount"]').content,currency:document.querySelector('meta[name="currency"]').content,redirect:{return_url:document.querySelector('meta[name="return-url"]').content}};document.getElementById("pay-now").addEventListener("submit",(function(t){t.preventDefault(),n.stripe.createSource(e).then((function(e){if(e.hasOwnProperty("source"))return window.location=e.source.redirect.url;this.errors.textContent="",this.errors.textContent=e.error.message,this.errors.hidden=!1}))}))})),this.key=t,this.errors=document.getElementById("errors")}(document.querySelector('meta[name="stripe-publishable-key"]').content).setupStripe().handle()}});
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=8)}({8:function(e,t,n){e.exports=n("HToU")},HToU:function(e,t){function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}new function e(t){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),n(this,"setupStripe",(function(){return r.stripe=Stripe(r.key),r})),n(this,"handle",(function(){var e={type:"alipay",amount:document.querySelector('meta[name="amount"]').content,currency:document.querySelector('meta[name="currency"]').content,redirect:{return_url:document.querySelector('meta[name="return-url"]').content}};document.getElementById("pay-now").addEventListener("submit",(function(t){t.preventDefault(),processingOverlay(!0),document.getElementById("pay-now").disabled=!0,r.stripe.createSource(e).then((function(e){if(e.hasOwnProperty("source"))return window.location=e.source.redirect.url;processingOverlay(!1),document.getElementById("pay-now").disabled=!1,this.errors.textContent="",this.errors.textContent=e.error.message,this.errors.hidden=!1}))}))})),this.key=t,this.errors=document.getElementById("errors")}(document.querySelector('meta[name="stripe-publishable-key"]').content).setupStripe().handle()}});
|
@ -1,2 +1,2 @@
|
||||
/*! For license information please see authorize-credit-card-payment.js.LICENSE.txt */
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=3)}({3:function(e,t,n){e.exports=n("hK5p")},hK5p:function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}new(function(){function e(t,n){var a=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),r(this,"handleAuthorization",(function(){var e=$("#my-card"),t={};t.clientKey=a.publicKey,t.apiLoginID=a.loginId;var n={};n.cardNumber=e.CardJs("cardNumber"),n.month=e.CardJs("expiryMonth"),n.year=e.CardJs("expiryYear"),n.cardCode=document.getElementById("cvv").value;var r={};return r.authData=t,r.cardData=n,Accept.dispatchData(r,a.responseHandler),!1})),r(this,"handle",(function(){if(a.cardButton&&a.cardButton.addEventListener("click",(function(){a.cardButton.disabled=!0,a.handleAuthorization()})),a.payNowButton){var e=!0,t=!1,n=void 0;try{for(var r,o=function(){var e=r.value;e.addEventListener("click",(function(){e.disabled=!0,a.handlePayNowAction(e.dataset.id)}))},u=a.payNowButton[Symbol.iterator]();!(e=(r=u.next()).done);e=!0)o()}catch(e){t=!0,n=e}finally{try{e||null==u.return||u.return()}finally{if(t)throw n}}}return a})),this.publicKey=t,this.loginId=n,this.cardHolderName=document.getElementById("cardholder_name"),this.cardButton=document.getElementById("card_button"),this.payNowButton=document.getElementsByClassName("pay_now_button")}var t,a,o;return t=e,(a=[{key:"handlePayNowAction",value:function(e){document.getElementById("token").value=e,document.getElementById("server_response").submit()}},{key:"responseHandler",value:function(e){return"Error"===e.messages.resultCode?$("#errors").show().html("<p>"+e.messages.message[0].code+": "+e.messages.message[0].text+"</p>"):"Ok"===e.messages.resultCode&&(document.getElementById("dataDescriptor").value=e.opaqueData.dataDescriptor,document.getElementById("dataValue").value=e.opaqueData.dataValue,document.getElementById("store_card").value=document.getElementById("store_card_checkbox").checked,document.getElementById("server_response").submit()),this.cardButton.disabled=!1,!1}}])&&n(t.prototype,a),o&&n(t,o),e}())(document.querySelector('meta[name="authorize-public-key"]').content,document.querySelector('meta[name="authorize-login-id"]').content).handle()}});
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=3)}({3:function(e,t,n){e.exports=n("hK5p")},hK5p:function(e,t){function n(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0,a=function(){};return{s:a,n:function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var u,i=!0,c=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return i=e.done,e},e:function(e){c=!0,u=e},f:function(){try{i||null==n.return||n.return()}finally{if(c)throw u}}}}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function o(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}new(function(){function e(t,r){var o=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),a(this,"handleAuthorization",(function(){var e=$("#my-card"),t={};t.clientKey=o.publicKey,t.apiLoginID=o.loginId;var n={};n.cardNumber=e.CardJs("cardNumber"),n.month=e.CardJs("expiryMonth"),n.year=e.CardJs("expiryYear"),n.cardCode=document.getElementById("cvv").value;var r={};return r.authData=t,r.cardData=n,processingOverlay(!0),Accept.dispatchData(r,o.responseHandler),!1})),a(this,"handle",(function(){if(o.cardButton&&o.cardButton.addEventListener("click",(function(){o.cardButton.disabled=!0,o.handleAuthorization()})),o.payNowButton){var e,t=n(o.payNowButton);try{var r=function(){var t=e.value;t.addEventListener("click",(function(){t.disabled=!0,o.handlePayNowAction(t.dataset.id)}))};for(t.s();!(e=t.n()).done;)r()}catch(e){t.e(e)}finally{t.f()}}return o})),this.publicKey=t,this.loginId=r,this.cardHolderName=document.getElementById("cardholder_name"),this.cardButton=document.getElementById("card_button"),this.payNowButton=document.getElementsByClassName("pay_now_button")}var t,r,u;return t=e,(r=[{key:"handlePayNowAction",value:function(e){document.getElementById("token").value=e,document.getElementById("server_response").submit()}},{key:"responseHandler",value:function(e){return processingOverlay(!1),"Error"===e.messages.resultCode?$("#errors").show().html("<p>"+e.messages.message[0].code+": "+e.messages.message[0].text+"</p>"):"Ok"===e.messages.resultCode&&(document.getElementById("dataDescriptor").value=e.opaqueData.dataDescriptor,document.getElementById("dataValue").value=e.opaqueData.dataValue,document.getElementById("store_card").value=document.getElementById("store_card_checkbox").checked,document.getElementById("server_response").submit()),this.cardButton.disabled=!1,!1}}])&&o(t.prototype,r),u&&o(t,u),e}())(document.querySelector('meta[name="authorize-public-key"]').content,document.querySelector('meta[name="authorize-login-id"]').content).handle()}});
|
2
public/js/clients/payments/process.js
vendored
2
public/js/clients/payments/process.js
vendored
@ -1,2 +1,2 @@
|
||||
/*! For license information please see process.js.LICENSE.txt */
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=12)}({12:function(e,t,n){e.exports=n("OXGg")},OXGg:function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}new(function(){function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.key=t,this.usingToken=n}var t,r,o;return t=e,(r=[{key:"setupStripe",value:function(){return this.stripe=Stripe(this.key),this.elements=this.stripe.elements(),this}},{key:"createElement",value:function(){return this.cardElement=this.elements.create("card"),this}},{key:"mountCardElement",value:function(){return this.cardElement.mount("#card-element"),this}},{key:"completePaymentUsingToken",value:function(){var e=this,t=document.getElementById("pay-now-with-token");this.stripe.handleCardPayment(t.dataset.secret,{payment_method:t.dataset.token}).then((function(t){return t.error?e.handleFailure(t.error.message):e.handleSuccess(t)}))}},{key:"completePaymentWithoutToken",value:function(){var e=this,t=document.getElementById("pay-now"),n=document.getElementById("cardholder-name");this.stripe.handleCardPayment(t.dataset.secret,this.cardElement,{payment_method_data:{billing_details:{name:n.value}}}).then((function(t){return t.error?e.handleFailure(t.error.message):e.handleSuccess(t)}))}},{key:"handleSuccess",value:function(e){document.querySelector('input[name="gateway_response"]').value=JSON.stringify(e.paymentIntent);var t=document.querySelector('input[name="token-billing-checkbox"]');t&&(document.querySelector('input[name="store_card"]').value=t.checked),document.getElementById("server-response").submit()}},{key:"handleFailure",value:function(e){var t=document.getElementById("errors");t.textContent="",t.textContent=e,t.hidden=!1}},{key:"handle",value:function(){var e=this;this.setupStripe(),this.usingToken&&document.getElementById("pay-now-with-token").addEventListener("click",(function(){return e.completePaymentUsingToken()})),this.usingToken||(this.createElement().mountCardElement(),document.getElementById("pay-now").addEventListener("click",(function(){return e.completePaymentWithoutToken()})))}}])&&n(t.prototype,r),o&&n(t,o),e}())(document.querySelector('meta[name="stripe-publishable-key"]').content,document.querySelector('meta[name="using-token"]').content).handle()}});
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=12)}({12:function(e,t,n){e.exports=n("OXGg")},OXGg:function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}new(function(){function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.key=t,this.usingToken=n}var t,r,o;return t=e,(r=[{key:"setupStripe",value:function(){return this.stripe=Stripe(this.key),this.elements=this.stripe.elements(),this}},{key:"createElement",value:function(){return this.cardElement=this.elements.create("card"),this}},{key:"mountCardElement",value:function(){return this.cardElement.mount("#card-element"),this}},{key:"completePaymentUsingToken",value:function(){var e=this,t=document.getElementById("pay-now-with-token");this.payNowButton=t,this.payNowButton.disabled=!0,processingOverlay(!0),this.stripe.handleCardPayment(t.dataset.secret,{payment_method:t.dataset.token}).then((function(t){return t.error?e.handleFailure(t.error.message):e.handleSuccess(t)}))}},{key:"completePaymentWithoutToken",value:function(){var e=this,t=document.getElementById("pay-now");this.payNowButton=t;var n=document.getElementById("cardholder-name");processingOverlay(!0),this.stripe.handleCardPayment(t.dataset.secret,this.cardElement,{payment_method_data:{billing_details:{name:n.value}}}).then((function(t){return document.getElementById("processing-overlay").classList.add("hidden"),t.error?e.handleFailure(t.error.message):e.handleSuccess(t)}))}},{key:"handleSuccess",value:function(e){processingOverlay(!1),document.querySelector('input[name="gateway_response"]').value=JSON.stringify(e.paymentIntent);var t=document.querySelector('input[name="token-billing-checkbox"]');t&&(document.querySelector('input[name="store_card"]').value=t.checked),document.getElementById("server-response").submit()}},{key:"handleFailure",value:function(e){var t=document.getElementById("errors");t.textContent="",t.textContent=e,t.hidden=!1,processingOverlay(!1),this.payNowButton.disabled=!1}},{key:"handle",value:function(){var e=this;this.setupStripe(),this.usingToken&&document.getElementById("pay-now-with-token").addEventListener("click",(function(){return e.completePaymentUsingToken()})),this.usingToken||(this.createElement().mountCardElement(),document.getElementById("pay-now").addEventListener("click",(function(){return e.completePaymentWithoutToken()})))}}])&&n(t.prototype,r),o&&n(t,o),e}())(document.querySelector('meta[name="stripe-publishable-key"]').content,document.querySelector('meta[name="using-token"]').content).handle()}});
|
2
public/js/clients/payments/sofort.js
vendored
2
public/js/clients/payments/sofort.js
vendored
@ -1,2 +1,2 @@
|
||||
/*! For license information please see sofort.js.LICENSE.txt */
|
||||
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/",r(r.s=7)}({7:function(e,t,r){e.exports=r("Zfcc")},Zfcc:function(e,t){function r(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}new function e(t){var n=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),r(this,"setupStripe",(function(){return n.stripe=Stripe(n.key),n})),r(this,"handle",(function(){var e={type:"sofort",amount:document.querySelector('meta[name="amount"]').content,currency:"eur",redirect:{return_url:document.querySelector('meta[name="return-url"]').content},sofort:{country:document.querySelector('meta[name="country"').content}};document.getElementById("pay-now").addEventListener("submit",(function(t){t.preventDefault(),n.stripe.createSource(e).then((function(e){if(e.hasOwnProperty("source"))return window.location=e.source.redirect.url;this.errors.textContent="",this.errors.textContent=e.error.message,this.errors.hidden=!1}))}))})),this.key=t,this.errors=document.getElementById("errors")}(document.querySelector('meta[name="stripe-publishable-key"]').content).setupStripe().handle()}});
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=7)}({7:function(e,t,n){e.exports=n("Zfcc")},Zfcc:function(e,t){function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}new function e(t){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),n(this,"setupStripe",(function(){return r.stripe=Stripe(r.key),r})),n(this,"handle",(function(){var e={type:"sofort",amount:document.querySelector('meta[name="amount"]').content,currency:"eur",redirect:{return_url:document.querySelector('meta[name="return-url"]').content},sofort:{country:document.querySelector('meta[name="country"').content}};document.getElementById("pay-now").addEventListener("submit",(function(t){t.preventDefault(),processingOverlay(!0),document.getElementById("pay-now").disabled=!0,r.stripe.createSource(e).then((function(e){if(e.hasOwnProperty("source"))return window.location=e.source.redirect.url;this.errors.textContent="",this.errors.textContent=e.error.message,this.errors.hidden=!1,processingOverlay(!1),document.getElementById("pay-now").disabled=!1}))}))})),this.key=t,this.errors=document.getElementById("errors")}(document.querySelector('meta[name="stripe-publishable-key"]').content).setupStripe().handle()}});
|
2
public/js/clients/quotes/action-selectors.js
vendored
2
public/js/clients/quotes/action-selectors.js
vendored
@ -1,2 +1,2 @@
|
||||
/*! For license information please see action-selectors.js.LICENSE.txt */
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=10)}({10:function(e,t,n){e.exports=n("ydWM")},ydWM:function(e,t){function n(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(new(function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.parentElement=document.querySelector(".form-check-parent"),this.parentForm=document.getElementById("bulkActions")}var t,r,o;return t=e,(r=[{key:"watchCheckboxes",value:function(e){var t=this;document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})),document.querySelectorAll(".form-check-child").forEach((function(n){e.checked?(n.checked=e.checked,t.processChildItem(n,document.getElementById("bulkActions"))):(n.checked=!1,document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})))}))}},{key:"processChildItem",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(n.hasOwnProperty("single")&&document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})),!1!==e.checked){var r=document.createElement("INPUT");r.setAttribute("name","invoices[]"),r.setAttribute("value",e.dataset.value),r.setAttribute("class","child-hidden-input"),r.hidden=!0,t.append(r)}else{var o=document.querySelectorAll("input.child-hidden-input"),c=!0,u=!1,l=void 0;try{for(var i,a=o[Symbol.iterator]();!(c=(i=a.next()).done);c=!0){var d=i.value;d.value==e.dataset.value&&d.remove()}}catch(e){u=!0,l=e}finally{try{c||null==a.return||a.return()}finally{if(u)throw l}}}}},{key:"handle",value:function(){var e=this;this.parentElement.addEventListener("click",(function(){e.watchCheckboxes(e.parentElement)}));var t=!0,n=!1,r=void 0;try{for(var o,c=function(){var t=o.value;t.addEventListener("click",(function(){e.processChildItem(t,e.parentForm)}))},u=document.querySelectorAll(".form-check-child")[Symbol.iterator]();!(t=(o=u.next()).done);t=!0)c()}catch(e){n=!0,r=e}finally{try{t||null==u.return||u.return()}finally{if(n)throw r}}}}])&&n(t.prototype,r),o&&n(t,o),e}())).handle()}});
|
||||
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=10)}({10:function(e,t,n){e.exports=n("ydWM")},ydWM:function(e,t){function n(e,t){var n;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return r(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var o=0,c=function(){};return{s:c,n:function(){return o>=e.length?{done:!0}:{done:!1,value:e[o++]}},e:function(e){throw e},f:c}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var u,i=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return i=e.done,e},e:function(e){l=!0,u=e},f:function(){try{i||null==n.return||n.return()}finally{if(l)throw u}}}}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function o(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(new(function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.parentElement=document.querySelector(".form-check-parent"),this.parentForm=document.getElementById("bulkActions")}var t,r,c;return t=e,(r=[{key:"watchCheckboxes",value:function(e){var t=this;document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})),document.querySelectorAll(".form-check-child").forEach((function(n){e.checked?(n.checked=e.checked,t.processChildItem(n,document.getElementById("bulkActions"))):(n.checked=!1,document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})))}))}},{key:"processChildItem",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(r.hasOwnProperty("single")&&document.querySelectorAll(".child-hidden-input").forEach((function(e){return e.remove()})),!1!==e.checked){var o=document.createElement("INPUT");o.setAttribute("name","invoices[]"),o.setAttribute("value",e.dataset.value),o.setAttribute("class","child-hidden-input"),o.hidden=!0,t.append(o)}else{var c,u=document.querySelectorAll("input.child-hidden-input"),i=n(u);try{for(i.s();!(c=i.n()).done;){var l=c.value;l.value==e.dataset.value&&l.remove()}}catch(e){i.e(e)}finally{i.f()}}}},{key:"handle",value:function(){var e=this;this.parentElement.addEventListener("click",(function(){e.watchCheckboxes(e.parentElement)}));var t,r=n(document.querySelectorAll(".form-check-child"));try{var o=function(){var n=t.value;n.addEventListener("click",(function(){e.processChildItem(n,e.parentForm)}))};for(r.s();!(t=r.n()).done;)o()}catch(e){r.e(e)}finally{r.f()}}}])&&o(t.prototype,r),c&&o(t,c),e}())).handle()}});
|
2
public/js/clients/shared/pdf.js
vendored
2
public/js/clients/shared/pdf.js
vendored
File diff suppressed because one or more lines are too long
224994
public/main.dart.js
vendored
224994
public/main.dart.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,21 +1,21 @@
|
||||
{
|
||||
"/js/app.js": "/js/app.js?id=baf7fef12d5e65c3d9ff",
|
||||
"/css/app.css": "/css/app.css?id=718489bc33e329ad1ab4",
|
||||
"/js/clients/invoices/action-selectors.js": "/js/clients/invoices/action-selectors.js?id=d244486b16dc6f94a726",
|
||||
"/js/app.js": "/js/app.js?id=a33a5a58bfc6e2174841",
|
||||
"/css/app.css": "/css/app.css?id=6275f3bfb92a11a19a8f",
|
||||
"/js/clients/invoices/action-selectors.js": "/js/clients/invoices/action-selectors.js?id=b0f29d5fdfa492962c22",
|
||||
"/js/clients/invoices/payment.js": "/js/clients/invoices/payment.js?id=d7e708d66a9c769b4c6e",
|
||||
"/js/clients/payment_methods/authorize-ach.js": "/js/clients/payment_methods/authorize-ach.js?id=9e6495d9ae236b3cb5ad",
|
||||
"/js/clients/payment_methods/authorize-authorize-card.js": "/js/clients/payment_methods/authorize-authorize-card.js?id=83c223814db63f9db590",
|
||||
"/js/clients/payment_methods/authorize-stripe-card.js": "/js/clients/payment_methods/authorize-stripe-card.js?id=f4c45f0da9868d840799",
|
||||
"/js/clients/payments/alipay.js": "/js/clients/payments/alipay.js?id=428ac5b81ed722636e8f",
|
||||
"/js/clients/payments/authorize-credit-card-payment.js": "/js/clients/payments/authorize-credit-card-payment.js?id=3a74587f41c617a7cc81",
|
||||
"/js/clients/payment_methods/authorize-ach.js": "/js/clients/payment_methods/authorize-ach.js?id=260b1515722aadacba1b",
|
||||
"/js/clients/payment_methods/authorize-authorize-card.js": "/js/clients/payment_methods/authorize-authorize-card.js?id=fda8f421f9e0e5b6a374",
|
||||
"/js/clients/payment_methods/authorize-stripe-card.js": "/js/clients/payment_methods/authorize-stripe-card.js?id=2855350c0cf901f432f2",
|
||||
"/js/clients/payments/alipay.js": "/js/clients/payments/alipay.js?id=766690d4207c0d8e75d1",
|
||||
"/js/clients/payments/authorize-credit-card-payment.js": "/js/clients/payments/authorize-credit-card-payment.js?id=914bbac0c52e458a55ea",
|
||||
"/js/clients/payments/card-js.min.js": "/js/clients/payments/card-js.min.js?id=7200ac43b87bddf1bedc",
|
||||
"/js/clients/payments/checkout.com.js": "/js/clients/payments/checkout.com.js?id=42d239882b80af83ad22",
|
||||
"/js/clients/payments/process.js": "/js/clients/payments/process.js?id=49b220081e0d7fa8140b",
|
||||
"/js/clients/payments/sofort.js": "/js/clients/payments/sofort.js?id=ff4ad07a93bd9fb327c1",
|
||||
"/js/clients/quotes/action-selectors.js": "/js/clients/quotes/action-selectors.js?id=b6b33ab51b58b51e1212",
|
||||
"/js/clients/payments/process.js": "/js/clients/payments/process.js?id=8f0a87e44b6e6824c010",
|
||||
"/js/clients/payments/sofort.js": "/js/clients/payments/sofort.js?id=ca99b358b094202d1e3a",
|
||||
"/js/clients/quotes/action-selectors.js": "/js/clients/quotes/action-selectors.js?id=1702ddb9f59521c7758f",
|
||||
"/js/clients/quotes/approve.js": "/js/clients/quotes/approve.js?id=1c5d76fb5f98bd49f6c8",
|
||||
"/js/clients/shared/multiple-downloads.js": "/js/clients/shared/multiple-downloads.js?id=bf87649ca30c9a3fba59",
|
||||
"/js/clients/shared/pdf.js": "/js/clients/shared/pdf.js?id=86f3b8d82f809268b3de",
|
||||
"/js/clients/shared/pdf.js": "/js/clients/shared/pdf.js?id=df93e290245c26694fdb",
|
||||
"/js/setup/setup.js": "/js/setup/setup.js?id=c4cd098778bf824a3470",
|
||||
"/css/card-js.min.css": "/css/card-js.min.css?id=62afeb675235451543ad"
|
||||
}
|
||||
|
25
resources/js/app.js
vendored
25
resources/js/app.js
vendored
@ -8,9 +8,32 @@ window.axios = require('axios');
|
||||
|
||||
/**
|
||||
* card-validator
|
||||
*
|
||||
*
|
||||
* Validate credit cards as users type.
|
||||
* https://github.com/braintree/card-validator
|
||||
*/
|
||||
window.valid = require('card-validator');
|
||||
|
||||
/**
|
||||
* Toggle processing overlay.
|
||||
*/
|
||||
window.processingOverlay = (show) => {
|
||||
if (show) {
|
||||
return document
|
||||
.getElementById('processing-overlay')
|
||||
.classList.remove('hidden');
|
||||
}
|
||||
|
||||
return document
|
||||
.getElementById('processing-overlay')
|
||||
.classList.add('hidden');
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove flashing message div after 3 seconds.
|
||||
*/
|
||||
document.querySelectorAll('.disposable-alert').forEach((element) => {
|
||||
setTimeout(() => {
|
||||
element.remove();
|
||||
}, 3000);
|
||||
});
|
||||
|
@ -37,6 +37,9 @@ class AuthorizeACH {
|
||||
};
|
||||
|
||||
handleError = (message) => {
|
||||
processingOverlay(false);
|
||||
document.getElementById('save-button').disabled = false;
|
||||
|
||||
this.errors.textContent = '';
|
||||
this.errors.textContent = message;
|
||||
this.errors.hidden = false;
|
||||
@ -51,6 +54,9 @@ class AuthorizeACH {
|
||||
};
|
||||
|
||||
handleSubmit = (e) => {
|
||||
processingOverlay(true);
|
||||
document.getElementById('save-button').disabled = true;
|
||||
|
||||
e.preventDefault();
|
||||
this.errors.textContent = '';
|
||||
this.errors.hidden = true;
|
||||
|
@ -35,6 +35,7 @@ class AuthorizeAuthorizeCard {
|
||||
secureData.authData = authData;
|
||||
secureData.cardData = cardData;
|
||||
|
||||
processingOverlay(true);
|
||||
|
||||
Accept.dispatchData(secureData, this.responseHandler);
|
||||
return false;
|
||||
@ -42,6 +43,7 @@ class AuthorizeAuthorizeCard {
|
||||
}
|
||||
|
||||
responseHandler(response) {
|
||||
processingOverlay(false);
|
||||
|
||||
if (response.messages.resultCode === "Error") {
|
||||
var i = 0;
|
||||
|
@ -11,8 +11,8 @@
|
||||
class AuthorizeStripeCard {
|
||||
constructor(key) {
|
||||
this.key = key;
|
||||
this.cardHolderName = document.getElementById("cardholder-name");
|
||||
this.cardButton = document.getElementById("card-button");
|
||||
this.cardHolderName = document.getElementById('cardholder-name');
|
||||
this.cardButton = document.getElementById('card-button');
|
||||
this.clientSecret = this.cardButton.dataset.secret;
|
||||
}
|
||||
|
||||
@ -24,49 +24,58 @@ class AuthorizeStripeCard {
|
||||
}
|
||||
|
||||
createElement() {
|
||||
this.cardElement = this.elements.create("card");
|
||||
this.cardElement = this.elements.create('card');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
mountCardElement() {
|
||||
this.cardElement.mount("#card-element");
|
||||
this.cardElement.mount('#card-element');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
handleStripe(stripe, cardHolderName) {
|
||||
processingOverlay(true);
|
||||
this.cardButton.disabled = true;
|
||||
|
||||
stripe
|
||||
.handleCardSetup(this.clientSecret, this.cardElement, {
|
||||
payment_method_data: {
|
||||
billing_details: { name: cardHolderName.value }
|
||||
}
|
||||
billing_details: { name: cardHolderName.value },
|
||||
},
|
||||
})
|
||||
.then(result => {
|
||||
.then((result) => {
|
||||
if (result.error) {
|
||||
return this.handleFailure(result);
|
||||
}
|
||||
|
||||
return this.handleSuccess(result);
|
||||
});
|
||||
}
|
||||
|
||||
handleFailure(result) {
|
||||
let errors = document.getElementById("errors");
|
||||
processingOverlay(false);
|
||||
this.cardButton.disabled = false;
|
||||
|
||||
errors.textContent = "";
|
||||
let errors = document.getElementById('errors');
|
||||
|
||||
errors.textContent = '';
|
||||
errors.textContent = result.error.message;
|
||||
errors.hidden = false;
|
||||
}
|
||||
|
||||
handleSuccess(result) {
|
||||
document.getElementById("gateway_response").value = JSON.stringify(
|
||||
document.getElementById('gateway_response').value = JSON.stringify(
|
||||
result.setupIntent
|
||||
);
|
||||
document.getElementById("is_default").value = document.getElementById(
|
||||
"proxy_is_default"
|
||||
document.getElementById('is_default').value = document.getElementById(
|
||||
'proxy_is_default'
|
||||
).checked;
|
||||
|
||||
document.getElementById("server_response").submit();
|
||||
processingOverlay(false);
|
||||
|
||||
document.getElementById('server_response').submit();
|
||||
}
|
||||
|
||||
handle() {
|
||||
@ -74,7 +83,7 @@ class AuthorizeStripeCard {
|
||||
.createElement()
|
||||
.mountCardElement();
|
||||
|
||||
this.cardButton.addEventListener("click", () => {
|
||||
this.cardButton.addEventListener('click', () => {
|
||||
this.handleStripe(this.stripe, this.cardHolderName);
|
||||
});
|
||||
|
||||
|
5
resources/js/clients/payments/alipay.js
vendored
5
resources/js/clients/payments/alipay.js
vendored
@ -33,12 +33,17 @@ class ProcessAlipay {
|
||||
|
||||
document.getElementById('pay-now').addEventListener('submit', (e) => {
|
||||
e.preventDefault();
|
||||
processingOverlay(true);
|
||||
document.getElementById('pay-now').disabled = true;
|
||||
|
||||
this.stripe.createSource(data).then(function(result) {
|
||||
if (result.hasOwnProperty('source')) {
|
||||
return (window.location = result.source.redirect.url);
|
||||
}
|
||||
|
||||
processingOverlay(false);
|
||||
document.getElementById('pay-now').disabled = false;
|
||||
|
||||
this.errors.textContent = '';
|
||||
this.errors.textContent = result.error.message;
|
||||
this.errors.hidden = false;
|
||||
|
@ -39,6 +39,7 @@ class AuthorizeAuthorizeCard {
|
||||
// send the bankData object instead of the cardData object.
|
||||
//
|
||||
// secureData.bankData = bankData;
|
||||
processingOverlay(true);
|
||||
|
||||
Accept.dispatchData(secureData, this.responseHandler);
|
||||
|
||||
@ -54,7 +55,7 @@ class AuthorizeAuthorizeCard {
|
||||
}
|
||||
|
||||
responseHandler(response) {
|
||||
|
||||
processingOverlay(false);
|
||||
|
||||
if (response.messages.resultCode === "Error") {
|
||||
var i = 0;
|
||||
|
50
resources/js/clients/payments/process.js
vendored
50
resources/js/clients/payments/process.js
vendored
@ -22,25 +22,30 @@ class ProcessStripePayment {
|
||||
}
|
||||
|
||||
createElement() {
|
||||
this.cardElement = this.elements.create("card");
|
||||
this.cardElement = this.elements.create('card');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
mountCardElement() {
|
||||
this.cardElement.mount("#card-element");
|
||||
this.cardElement.mount('#card-element');
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
completePaymentUsingToken() {
|
||||
let payNowButton = document.getElementById("pay-now-with-token");
|
||||
let payNowButton = document.getElementById('pay-now-with-token');
|
||||
|
||||
this.payNowButton = payNowButton;
|
||||
this.payNowButton.disabled = true;
|
||||
|
||||
processingOverlay(true);
|
||||
|
||||
this.stripe
|
||||
.handleCardPayment(payNowButton.dataset.secret, {
|
||||
payment_method: payNowButton.dataset.token
|
||||
payment_method: payNowButton.dataset.token,
|
||||
})
|
||||
.then(result => {
|
||||
.then((result) => {
|
||||
if (result.error) {
|
||||
return this.handleFailure(result.error.message);
|
||||
}
|
||||
@ -50,16 +55,24 @@ class ProcessStripePayment {
|
||||
}
|
||||
|
||||
completePaymentWithoutToken() {
|
||||
let payNowButton = document.getElementById("pay-now");
|
||||
let cardHolderName = document.getElementById("cardholder-name");
|
||||
let payNowButton = document.getElementById('pay-now');
|
||||
this.payNowButton = payNowButton;
|
||||
|
||||
let cardHolderName = document.getElementById('cardholder-name');
|
||||
|
||||
processingOverlay(true);
|
||||
|
||||
this.stripe
|
||||
.handleCardPayment(payNowButton.dataset.secret, this.cardElement, {
|
||||
payment_method_data: {
|
||||
billing_details: { name: cardHolderName.value }
|
||||
}
|
||||
billing_details: { name: cardHolderName.value },
|
||||
},
|
||||
})
|
||||
.then(result => {
|
||||
.then((result) => {
|
||||
document
|
||||
.getElementById('processing-overlay')
|
||||
.classList.add('hidden');
|
||||
|
||||
if (result.error) {
|
||||
return this.handleFailure(result.error.message);
|
||||
}
|
||||
@ -69,6 +82,8 @@ class ProcessStripePayment {
|
||||
}
|
||||
|
||||
handleSuccess(result) {
|
||||
processingOverlay(false);
|
||||
|
||||
document.querySelector(
|
||||
'input[name="gateway_response"]'
|
||||
).value = JSON.stringify(result.paymentIntent);
|
||||
@ -82,15 +97,18 @@ class ProcessStripePayment {
|
||||
tokenBillingCheckbox.checked;
|
||||
}
|
||||
|
||||
document.getElementById("server-response").submit();
|
||||
document.getElementById('server-response').submit();
|
||||
}
|
||||
|
||||
handleFailure(message) {
|
||||
let errors = document.getElementById("errors");
|
||||
let errors = document.getElementById('errors');
|
||||
|
||||
errors.textContent = "";
|
||||
errors.textContent = '';
|
||||
errors.textContent = message;
|
||||
errors.hidden = false;
|
||||
|
||||
processingOverlay(false);
|
||||
this.payNowButton.disabled = false;
|
||||
}
|
||||
|
||||
handle() {
|
||||
@ -98,8 +116,8 @@ class ProcessStripePayment {
|
||||
|
||||
if (this.usingToken) {
|
||||
document
|
||||
.getElementById("pay-now-with-token")
|
||||
.addEventListener("click", () => {
|
||||
.getElementById('pay-now-with-token')
|
||||
.addEventListener('click', () => {
|
||||
return this.completePaymentUsingToken();
|
||||
});
|
||||
}
|
||||
@ -107,7 +125,7 @@ class ProcessStripePayment {
|
||||
if (!this.usingToken) {
|
||||
this.createElement().mountCardElement();
|
||||
|
||||
document.getElementById("pay-now").addEventListener("click", () => {
|
||||
document.getElementById('pay-now').addEventListener('click', () => {
|
||||
return this.completePaymentWithoutToken();
|
||||
});
|
||||
}
|
||||
|
6
resources/js/clients/payments/sofort.js
vendored
6
resources/js/clients/payments/sofort.js
vendored
@ -36,6 +36,8 @@ class ProcessSOFORT {
|
||||
|
||||
document.getElementById('pay-now').addEventListener('submit', (e) => {
|
||||
e.preventDefault();
|
||||
processingOverlay(true);
|
||||
document.getElementById('pay-now').disabled = true;
|
||||
|
||||
this.stripe.createSource(data).then(function(result) {
|
||||
if (result.hasOwnProperty('source')) {
|
||||
@ -45,6 +47,10 @@ class ProcessSOFORT {
|
||||
this.errors.textContent = '';
|
||||
this.errors.textContent = result.error.message;
|
||||
this.errors.hidden = false;
|
||||
|
||||
processingOverlay(false);
|
||||
|
||||
document.getElementById('pay-now').disabled = false;
|
||||
});
|
||||
});
|
||||
};
|
||||
|
@ -3264,4 +3264,9 @@ return [
|
||||
'payment_error_code_20087' => '20087: Bad Track Data (invalid CVV and/or expiry date)',
|
||||
|
||||
'download_selected' => 'Download selected',
|
||||
|
||||
'to_pay_invoices' => 'To pay invoices, you have to',
|
||||
'add_payment_method_first' => 'add payment method',
|
||||
|
||||
'no_items_selected' => 'No items selected.',
|
||||
];
|
||||
|
4
resources/sass/components/buttons.scss
vendored
4
resources/sass/components/buttons.scss
vendored
@ -2,6 +2,10 @@
|
||||
@apply rounded py-3 px-4 text-sm leading-4 transition duration-150 ease-in-out font-semibold;
|
||||
}
|
||||
|
||||
button:disabled {
|
||||
@apply opacity-50 cursor-not-allowed;
|
||||
}
|
||||
|
||||
.button-primary {
|
||||
@apply bg-blue-500 text-white;
|
||||
|
||||
|
@ -12,14 +12,21 @@
|
||||
</head>
|
||||
|
||||
<style>
|
||||
#product-table tbody > tr:nth-child(even) {
|
||||
tbody > tr:nth-child(even) {
|
||||
background-color: #edf2f7;
|
||||
}
|
||||
|
||||
/** Required for proper margins on print **/
|
||||
@page {
|
||||
margin-bottom: 8.5mm;
|
||||
}
|
||||
|
||||
/** Custom CSS goes here.. */
|
||||
</style>
|
||||
|
||||
<body class="antialiased break-words bg-white">
|
||||
<!-- Company logo, company details -->
|
||||
<div class="$global-padding static bg-gray-800">
|
||||
<div class="$global-padding static bg-gray-800" id="header">
|
||||
<div class="grid grid-cols-12">
|
||||
<div class="absolute col-span-4 p-6 pb-10 bg-white">
|
||||
<img
|
||||
@ -36,7 +43,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Client details, entity details -->
|
||||
<div class="grid grid-cols-12 gap-4 my-12 ml-12">
|
||||
@ -60,7 +66,10 @@
|
||||
|
||||
<!-- Product table -->
|
||||
<div class="$global-margin">
|
||||
<table id="product-table" class="w-full mt-8 table-auto"></table>
|
||||
<table
|
||||
id="product-table"
|
||||
class="w-full table-auto mt-8 $table-padding"
|
||||
></table>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
|
@ -25,11 +25,19 @@
|
||||
tbody > tr > td:first-child {
|
||||
color: #d03801;
|
||||
}
|
||||
|
||||
/** Required for proper margins on print **/
|
||||
@page {
|
||||
margin-top: 8.5mm;
|
||||
margin-bottom: 8.5mm;
|
||||
}
|
||||
|
||||
/** Custom CSS goes here.. */
|
||||
</style>
|
||||
|
||||
<body class="$global-margin bg-white break-words antialiased">
|
||||
<!-- Logo, company details & company address -->
|
||||
<div class="flex grid items-start grid-cols-12 gap-4">
|
||||
<div class="flex grid items-start grid-cols-12 gap-4" id="header">
|
||||
<img
|
||||
src="$company.logo"
|
||||
alt="$company.name"
|
||||
@ -68,7 +76,7 @@
|
||||
<!-- Product table -->
|
||||
<table
|
||||
id="product-table"
|
||||
class="w-full mt-20 rounded table-auto"
|
||||
class="w-full mt-20 rounded table-auto $table-padding"
|
||||
></table>
|
||||
</body>
|
||||
|
||||
|
@ -15,11 +15,19 @@
|
||||
#product-table tbody > tr:nth-child(even) {
|
||||
background-color: #f7fafc;
|
||||
}
|
||||
|
||||
/** Required for proper margins on print **/
|
||||
@page {
|
||||
margin-top: 8.5mm;
|
||||
margin-bottom: 8.5mm;
|
||||
}
|
||||
|
||||
/** Custom CSS goes here.. */
|
||||
</style>
|
||||
|
||||
<body class="$global-margin bg-white break-words antialiased">
|
||||
<!-- Company logo, company details -->
|
||||
<div class="grid grid-cols-12 px-2">
|
||||
<div class="grid grid-cols-12 px-2" id="header">
|
||||
<img
|
||||
src="$company_logo"
|
||||
alt="$company_name logo"
|
||||
@ -34,7 +42,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Entity labels, client details -->
|
||||
<p class="mt-10 px-2 text-xl text-blue-500 uppercase">$entity_label</p>
|
||||
<p class="px-2 mt-10 text-xl text-blue-500 uppercase">$entity_label</p>
|
||||
<div class="grid grid-cols-12 px-2 py-3 mt-4 border-t border-b">
|
||||
<div class="col-span-6">
|
||||
<table id="entity-details"></table>
|
||||
@ -43,7 +51,10 @@
|
||||
</div>
|
||||
|
||||
<!-- Product table -->
|
||||
<table id="product-table" class="table-auto mt-12 w-full"></table>
|
||||
<table
|
||||
id="product-table"
|
||||
class="table-auto w-full mt-12 $table-padding"
|
||||
></table>
|
||||
</body>
|
||||
|
||||
<footer id="footer"></footer>
|
||||
|
@ -19,11 +19,19 @@
|
||||
#product-table tbody > tr:nth-child(odd) {
|
||||
background-color: #f7fafc;
|
||||
}
|
||||
|
||||
/** Required for proper margins on print **/
|
||||
@page {
|
||||
margin-top: 8.5mm;
|
||||
margin-bottom: 8.5mm;
|
||||
}
|
||||
|
||||
/** Custom CSS goes here.. */
|
||||
</style>
|
||||
|
||||
<body class="$global-margin antialiased bg-white break-words">
|
||||
<!-- Client details, company details, company logo -->
|
||||
<div class="grid grid-cols-12 gap-4">
|
||||
<div class="grid grid-cols-12 gap-4" id="header">
|
||||
<!-- Client details -->
|
||||
<div class="col-span-4">
|
||||
<div id="client-details"></div>
|
||||
@ -61,7 +69,7 @@
|
||||
|
||||
<table
|
||||
id="product-table"
|
||||
class="w-full mt-10 border-t-4 border-pink-700 table-auto"
|
||||
class="w-full mt-10 border-t-4 border-pink-700 table-auto $table-padding"
|
||||
></table>
|
||||
</body>
|
||||
|
||||
|
@ -11,9 +11,19 @@
|
||||
<link rel="stylesheet" href="$app_url/css/tailwindcss@1.4.6.css" />
|
||||
</head>
|
||||
|
||||
<style>
|
||||
/** Required for proper margins on print **/
|
||||
@page {
|
||||
margin-top: 8.5mm;
|
||||
margin-bottom: 8.5mm;
|
||||
}
|
||||
|
||||
/** Custom CSS goes here.. */
|
||||
</style>
|
||||
|
||||
<body class="$global-margin antialiased bg-white break-words">
|
||||
<!-- Company logo, entity details -->
|
||||
<div class="grid grid-cols-12 gap-4 pb-6 border-b-4 border-black">
|
||||
<div class="grid grid-cols-12 gap-4 pb-6 border-b-4 border-black" id="header">
|
||||
<div class="col-span-6">
|
||||
<img
|
||||
src="$company.logo"
|
||||
@ -24,7 +34,10 @@
|
||||
<div class="flex flex-col items-end col-span-6">
|
||||
<table id="entity-details"></table>
|
||||
</div>
|
||||
<div class="col-span-6">
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-12">
|
||||
<div class="col-span-6 py-6">
|
||||
<p class="text-xl font-semibold uppercase">
|
||||
$your_entity_label
|
||||
</p>
|
||||
@ -44,16 +57,19 @@
|
||||
</div>
|
||||
|
||||
<!-- Product table -->
|
||||
<table id="product-table" class="w-full mt-10 table-auto"></table>
|
||||
<table
|
||||
id="product-table"
|
||||
class="w-full mt-10 table-auto $table-padding"
|
||||
></table>
|
||||
|
||||
<!-- Thanks label -->
|
||||
<p
|
||||
class="w-full pb-4 mt-10 text-2xl font-semibold text-center border-b-4 border-black"
|
||||
>
|
||||
$thanks_label
|
||||
</p>
|
||||
<div class="w-full border-black order-b wpy-1"></div>
|
||||
<div id="footer">
|
||||
<p
|
||||
class="w-full pb-4 mt-10 text-2xl font-semibold text-center border-b-4 border-black"
|
||||
>
|
||||
$thanks_label
|
||||
</p>
|
||||
<div class="w-full border-black order-b wpy-1"></div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
<footer id="footer"></footer>
|
||||
</html>
|
||||
|
@ -11,9 +11,19 @@
|
||||
<link rel="stylesheet" href="$app_url/css/tailwindcss@1.4.6.css" />
|
||||
</head>
|
||||
|
||||
<style>
|
||||
/** Required for proper margins on print **/
|
||||
@page {
|
||||
margin-top: 8.5mm;
|
||||
margin-bottom: 8.5mm;
|
||||
}
|
||||
|
||||
/** Custom CSS goes here.. */
|
||||
</style>
|
||||
|
||||
<body class="$global-margin antialiased break-words bg-white">
|
||||
<!-- Company details, address, client details, company logo -->
|
||||
<div class="grid grid-cols-12 gap-4">
|
||||
<div class="grid grid-cols-12 gap-4" id="header">
|
||||
<div class="col-span-4 pl-4 border-l border-black">
|
||||
<div id="company-details">
|
||||
<p class="font-semibold text-yellow-600 uppercase">
|
||||
@ -49,7 +59,10 @@
|
||||
></div>
|
||||
|
||||
<!-- Product table -->
|
||||
<table id="product-table" class="w-full mt-10 table-auto"></table>
|
||||
<table
|
||||
id="product-table"
|
||||
class="w-full mt-10 table-auto $table-padding"
|
||||
></table>
|
||||
</body>
|
||||
|
||||
<footer id="footer"></footer>
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
<body class="antialiased break-words bg-white">
|
||||
<!-- Company name, entity details -->
|
||||
<div class="bg-orange-600">
|
||||
<div class="bg-orange-600" id="header">
|
||||
<div class="$global-padding">
|
||||
<div class="grid grid-cols-12">
|
||||
<div class="col-span-4">
|
||||
@ -30,8 +30,8 @@
|
||||
|
||||
<div class="$global-margin">
|
||||
<!-- Company logo, client details -->
|
||||
<div class="col-span-12 mb-10">
|
||||
<p class="text-xl text-orange-600 font-semibold uppercase">
|
||||
<div class="col-span-12 mt-6 mb-10">
|
||||
<p class="text-xl font-semibold text-orange-600 uppercase">
|
||||
$your_entity_label
|
||||
</p>
|
||||
</div>
|
||||
@ -45,11 +45,14 @@
|
||||
</div>
|
||||
|
||||
<!-- Product table -->
|
||||
<table id="product-table" class="w-full mt-8 table-auto"></table>
|
||||
<table
|
||||
id="product-table"
|
||||
class="w-full mt-8 mb-10 table-auto $table-padding"
|
||||
></table>
|
||||
</div>
|
||||
|
||||
<!-- Company details -->
|
||||
<div class="bg-orange-600">
|
||||
<footer id="footer" class="fixed bottom-0 w-full bg-orange-600">
|
||||
<div class="$global-padding">
|
||||
<div class="grid grid-cols-12">
|
||||
<div
|
||||
@ -60,8 +63,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
<footer id="footer"></footer>
|
||||
</html>
|
||||
|
@ -11,9 +11,19 @@
|
||||
<link rel="stylesheet" href="$app_url/css/tailwindcss@1.4.6.css" />
|
||||
</head>
|
||||
|
||||
<style>
|
||||
/** Required for proper margins on print **/
|
||||
@page {
|
||||
margin-top: 8.5mm;
|
||||
margin-bottom: 8.5mm;
|
||||
}
|
||||
|
||||
/** Custom CSS goes here.. */
|
||||
</style>
|
||||
|
||||
<body class="$global-margin antialiased break-words bg-white">
|
||||
<!-- Company name, company address, company logo -->
|
||||
<div class="grid grid-cols-12 gap-4">
|
||||
<div class="grid grid-cols-12 gap-4" id="header">
|
||||
<div class="col-span-4">$company.name</div>
|
||||
<div class="col-span-4" id="company-address"></div>
|
||||
<div class="col-span-4">
|
||||
@ -35,7 +45,7 @@
|
||||
<!-- Client details -->
|
||||
<div class="grid grid-cols-12 mt-12">
|
||||
<div class="col-span-12 mb-10">
|
||||
<p class="text-xl text-black font-semibold uppercase">
|
||||
<p class="text-xl font-semibold text-black uppercase">
|
||||
$your_entity_label
|
||||
</p>
|
||||
</div>
|
||||
@ -43,7 +53,10 @@
|
||||
</div>
|
||||
|
||||
<!-- Product table -->
|
||||
<table id="product-table" class="w-full mt-8 table-auto"></table>
|
||||
<table
|
||||
id="product-table"
|
||||
class="w-full mt-8 table-auto $table-padding"
|
||||
></table>
|
||||
</body>
|
||||
|
||||
<footer id="footer"></footer>
|
||||
|
@ -20,11 +20,19 @@
|
||||
color: #9b2c2c;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/** Required for proper margins on print **/
|
||||
@page {
|
||||
margin-top: 8.5mm;
|
||||
margin-bottom: 8.5mm;
|
||||
}
|
||||
|
||||
/** Custom CSS goes here.. */
|
||||
</style>
|
||||
|
||||
<body class="$global-margin antialiased bg-white break-words">
|
||||
<!-- Company logo, entity details -->
|
||||
<div class="grid grid-cols-12 gap-4">
|
||||
<div class="grid grid-cols-12 gap-4" id="header">
|
||||
<div class="col-span-4">
|
||||
<img
|
||||
src="$company.logo"
|
||||
@ -40,7 +48,7 @@
|
||||
<!-- Company details, client details -->
|
||||
<div class="grid grid-cols-12 gap-12 mt-12">
|
||||
<div class="col-span-12">
|
||||
<p class="text-xl text-teal-600 font-semibold uppercase">
|
||||
<p class="text-xl font-semibold text-teal-600 uppercase">
|
||||
$your_entity_label
|
||||
</p>
|
||||
</div>
|
||||
@ -64,7 +72,10 @@
|
||||
</div>
|
||||
|
||||
<!-- Product table -->
|
||||
<table id="product-table" class="w-full mt-10 table-auto"></table>
|
||||
<table
|
||||
id="product-table"
|
||||
class="w-full mt-10 table-auto $table-padding"
|
||||
></table>
|
||||
</body>
|
||||
|
||||
<footer id="footer"></footer>
|
||||
|
@ -22,7 +22,7 @@
|
||||
</div>
|
||||
|
||||
<div class="mx-auto px-4 sm:px-6 md:px-8">
|
||||
<div class="pt-4">
|
||||
<div class="pt-4 py-6">
|
||||
@includeWhen(session()->has('success'), 'portal.ninja2020.components.general.messages.success')
|
||||
{{ $slot }}
|
||||
</div>
|
||||
|
@ -10,22 +10,24 @@
|
||||
</select>
|
||||
</div>
|
||||
<div class="relative" x-data="{ open: false }" x-on:click.away="open = false">
|
||||
<button x-on:click="open = !open" class="button button-primary">{{ ctrans('texts.add_payment_method') }}</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-100" x-transition:enter-start="transform opacity-0 scale-95" x-transition:enter-end="transform opacity-100 scale-100" x-transition:leave="transition ease-in duration-75" x-transition:leave-start="transform opacity-100 scale-100" x-transition:leave-end="transform opacity-0 scale-95" class="origin-top-right absolute right-0 mt-2 w-48 rounded-md shadow-lg">
|
||||
<div class="py-1 rounded-md bg-white shadow-xs">
|
||||
@if($client->getCreditCardGateway())
|
||||
<a href="{{ route('client.payment_methods.create', ['method' => App\Models\GatewayType::CREDIT_CARD]) }}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition ease-in-out duration-150">
|
||||
{{ ctrans('texts.credit_card') }}
|
||||
</a>
|
||||
@endif
|
||||
|
||||
@if($client->getBankTransferGateway())
|
||||
<a href="{{ route('client.payment_methods.create', ['method' => $client->getBankTransferMethodType()]) }}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition ease-in-out duration-150">
|
||||
{{ ctrans('texts.bank_account') }}
|
||||
</a>
|
||||
@endif
|
||||
<!-- Add payment method button -->
|
||||
@if($client->getCreditCardGateway() || $client->getBankTransferGateway())
|
||||
<button x-on:click="open = !open" class="button button-primary">{{ ctrans('texts.add_payment_method') }}</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-100" x-transition:enter-start="transform opacity-0 scale-95" x-transition:enter-end="transform opacity-100 scale-100" x-transition:leave="transition ease-in duration-75" x-transition:leave-start="transform opacity-100 scale-100" x-transition:leave-end="transform opacity-0 scale-95" class="origin-top-right absolute right-0 mt-2 w-48 rounded-md shadow-lg">
|
||||
<div class="py-1 rounded-md bg-white shadow-xs">
|
||||
@if($client->getCreditCardGateway())
|
||||
<a href="{{ route('client.payment_methods.create', ['method' => App\Models\GatewayType::CREDIT_CARD]) }}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition ease-in-out duration-150">
|
||||
{{ ctrans('texts.credit_card') }}
|
||||
</a>
|
||||
@endif
|
||||
@if($client->getBankTransferGateway())
|
||||
<a href="{{ route('client.payment_methods.create', ['method' => $client->getBankTransferMethodType()]) }}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 transition ease-in-out duration-150">
|
||||
{{ ctrans('texts.bank_account') }}
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="-my-2 py-2 overflow-x-auto sm:-mx-6 sm:px-6 lg:-mx-8 lg:px-8">
|
||||
|
@ -0,0 +1,17 @@
|
||||
<div class="fixed z-10 inset-0 overflow-y-auto hidden" id="processing-overlay">
|
||||
<div class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
|
||||
<div class="fixed inset-0 transition-opacity">
|
||||
<div class="absolute inset-0 bg-gray-500 opacity-75"></div>
|
||||
</div>
|
||||
<span class="hidden sm:inline-block sm:align-middle sm:h-screen"></span>​
|
||||
<div class="inline-block align-bottom bg-white rounded px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-sm sm:w-full sm:p-6" role="dialog" aria-modal="true" aria-labelledby="modal-headline">
|
||||
<div class="flex justify-center items-center">
|
||||
<svg class="animate-spin -ml-1 mr-3 h-5 w-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
|
||||
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
|
||||
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
|
||||
</svg>
|
||||
<h2 class="text-2xl">{{ ctrans('texts.processing') }}</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -104,7 +104,7 @@
|
||||
</span>
|
||||
</div>
|
||||
<div class="bg-white px-4 py-5 flex justify-end">
|
||||
<button type="submit" class="button button-primary">
|
||||
<button type="submit" class="button button-primary" id="save-button">
|
||||
{{ ctrans('texts.save') }}
|
||||
</button>
|
||||
</div>
|
||||
|
@ -48,8 +48,14 @@
|
||||
{{ ctrans('texts.save_as_default') }}
|
||||
</dt>
|
||||
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
||||
<input type="checkbox" class="form-checkbox" name="proxy_is_default"
|
||||
id="proxy_is_default"/>
|
||||
<label for="yes" class="mr-4">
|
||||
<input type="radio" class="form-radio cursor-pointer" name="proxy_is_default" {{ $client->getSetting('auto_bill') == 'on' ? 'checked': '' }} id="proxy_is_default" value="true">
|
||||
<span class="ml-1">{{ ctrans('texts.yes') }}</span>
|
||||
</label>
|
||||
<label for="no">
|
||||
<input type="radio" class="form-radio cursor-pointer" name="proxy_is_default" {{ $client->getSetting('auto_bill') == 'off' ? 'checked': '' }} id="proxy_is_default" value="false">
|
||||
<span class="ml-1">{{ ctrans('texts.no') }}</span>
|
||||
</label>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="bg-white px-4 py-5 flex justify-end">
|
||||
|
@ -47,7 +47,11 @@
|
||||
data-secret="{{ $intent->client_secret }}"
|
||||
data-token="{{ $token->token }}"
|
||||
id="pay-now-with-token"
|
||||
class="button button-primary">
|
||||
class="button button-primary inline-flex items-center">
|
||||
<svg class="hidden animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
|
||||
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
|
||||
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
|
||||
</svg>
|
||||
{{ ctrans('texts.pay_now') }}
|
||||
</button>
|
||||
</div>
|
||||
|
@ -5,7 +5,6 @@
|
||||
<meta name="show-invoice-terms" content="{{ $settings->show_accept_invoice_terms ? true : false }}">
|
||||
<meta name="require-invoice-signature" content="{{ $settings->require_invoice_signature ? true : false }}">
|
||||
<script src="https://cdn.jsdelivr.net/npm/signature_pad@2.3.2/dist/signature_pad.min.js"></script>
|
||||
<meta name="turbolinks-visit-control" content="reload">
|
||||
@endpush
|
||||
|
||||
@section('body')
|
||||
@ -23,36 +22,44 @@
|
||||
<div class="col-span-6 md:col-start-2 md:col-span-4">
|
||||
<div class="flex justify-end">
|
||||
<div class="flex justify-end mb-2">
|
||||
<div x-data="{ open: false }" @keydown.window.escape="open = false" @click.away="open = false"
|
||||
class="relative inline-block text-left">
|
||||
<div>
|
||||
<div class="rounded-md shadow-sm">
|
||||
<button @click="open = !open" type="button"
|
||||
class="inline-flex justify-center w-full rounded-md border border-gray-300 px-4 py-2 bg-white text-sm leading-5 font-medium text-gray-700 hover:text-gray-500 focus:outline-none focus:border-blue-300 focus:shadow-outline-blue active:bg-gray-50 active:text-gray-800 transition ease-in-out duration-150">
|
||||
{{ ctrans('texts.pay_now') }}
|
||||
<svg class="-mr-1 ml-2 h-5 w-5" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
||||
clip-rule="evenodd"/>
|
||||
</svg>
|
||||
</button>
|
||||
<!-- Pay now button -->
|
||||
@if(count($payment_methods) > 0)
|
||||
<div x-data="{ open: false }" @keydown.window.escape="open = false" @click.away="open = false"
|
||||
class="relative inline-block text-left">
|
||||
<div>
|
||||
<div class="rounded-md shadow-sm">
|
||||
<button @click="open = !open" type="button"
|
||||
class="inline-flex justify-center w-full rounded-md border border-gray-300 px-4 py-2 bg-white text-sm leading-5 font-medium text-gray-700 hover:text-gray-500 focus:outline-none focus:border-blue-300 focus:shadow-outline-blue active:bg-gray-50 active:text-gray-800 transition ease-in-out duration-150">
|
||||
{{ ctrans('texts.pay_now') }}
|
||||
<svg class="-mr-1 ml-2 h-5 w-5" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
|
||||
clip-rule="evenodd"/>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div x-show="open" class="origin-top-right absolute right-0 mt-2 w-56 rounded-md shadow-lg">
|
||||
<div class="rounded-md bg-white shadow-xs">
|
||||
<div class="py-1">
|
||||
@foreach($payment_methods as $payment_method)
|
||||
<a data-turbolinks="false" href="#" @click="{ open = false }"
|
||||
data-company-gateway-id="{{ $payment_method['company_gateway_id'] }}"
|
||||
data-gateway-type-id="{{ $payment_method['gateway_type_id'] }}"
|
||||
class="dropdown-gateway-button block px-4 py-2 text-sm leading-5 text-gray-700 hover:bg-gray-100 hover:text-gray-900 focus:outline-none focus:bg-gray-100 focus:text-gray-900">
|
||||
{{ $payment_method['label'] }}
|
||||
</a>
|
||||
@endforeach
|
||||
<div x-show="open" class="origin-top-right absolute right-0 mt-2 w-56 rounded-md shadow-lg">
|
||||
<div class="rounded-md bg-white shadow-xs">
|
||||
<div class="py-1">
|
||||
@foreach($payment_methods as $payment_method)
|
||||
<a data-turbolinks="false" href="#" @click="{ open = false }"
|
||||
data-company-gateway-id="{{ $payment_method['company_gateway_id'] }}"
|
||||
data-gateway-type-id="{{ $payment_method['gateway_type_id'] }}"
|
||||
class="dropdown-gateway-button block px-4 py-2 text-sm leading-5 text-gray-700 hover:bg-gray-100 hover:text-gray-900 focus:outline-none focus:bg-gray-100 focus:text-gray-900">
|
||||
{{ $payment_method['label'] }}
|
||||
</a>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<span class="inline-flex items-center text-sm">
|
||||
<span>{{ ctrans('texts.to_pay_invoices') }} </span>
|
||||
<a class="button-link" href="{{ route('client.payment_methods.index') }}">{{ ctrans('texts.add_payment_method_first') }}.</a>
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -69,6 +69,13 @@
|
||||
</head>
|
||||
|
||||
<body class="antialiased">
|
||||
@if(session()->has('message'))
|
||||
<div class="bg-blue-800 text-sm py-1 text-white text-center disposable-alert">
|
||||
{{ session('message') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@include('portal.ninja2020.components.processing')
|
||||
@component('portal.ninja2020.components.general.sidebar.main')
|
||||
@yield('body')
|
||||
@endcomponent
|
||||
|
@ -146,6 +146,8 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
|
||||
// Route::delete('hooks/{subscription_id}', 'SubscriptionController@unsubscribe')->name('hooks.unsubscribe');
|
||||
|
||||
Route::resource('webhooks', 'WebhookController');
|
||||
Route::resource('system_logs', 'SystemLogController');
|
||||
|
||||
Route::post('webhooks/bulk', 'WebhookController@bulk')->name('webhooks.bulk');
|
||||
|
||||
/*Company Ledger */
|
||||
|
@ -50,6 +50,8 @@ class PdfMakerDesignsTest extends TestCase
|
||||
],
|
||||
],
|
||||
];
|
||||
|
||||
exec('echo "" > storage/logs/laravel.log');
|
||||
}
|
||||
|
||||
public function testBusiness()
|
||||
@ -136,16 +138,14 @@ class PdfMakerDesignsTest extends TestCase
|
||||
'#invoice-issued-to' => 'Invoice issued to',
|
||||
], $this->state['variables']),
|
||||
];
|
||||
|
||||
|
||||
|
||||
|
||||
$maker = new PdfMaker($state);
|
||||
|
||||
$maker
|
||||
->design(Business::class)
|
||||
->build();
|
||||
|
||||
//exec('echo "" > storage/logs/laravel.log');
|
||||
exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
info($maker->getCompiledHTML());
|
||||
|
||||
@ -256,8 +256,6 @@ class PdfMakerDesignsTest extends TestCase
|
||||
->design(Clean::class)
|
||||
->build();
|
||||
|
||||
//exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
info($maker->getCompiledHTML(true));
|
||||
|
||||
$this->assertTrue(true);
|
||||
@ -371,6 +369,8 @@ class PdfMakerDesignsTest extends TestCase
|
||||
->design(Modern::class)
|
||||
->build();
|
||||
|
||||
info($maker->getCompiledHTML());
|
||||
|
||||
//exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
//info($maker->getCompiledHTML(true));
|
||||
@ -378,7 +378,6 @@ class PdfMakerDesignsTest extends TestCase
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
|
||||
|
||||
public function testBold()
|
||||
{
|
||||
$state = [
|
||||
@ -487,11 +486,7 @@ class PdfMakerDesignsTest extends TestCase
|
||||
->design(Bold::class)
|
||||
->build();
|
||||
|
||||
//exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
//info($maker->getCompiledHTML(true));
|
||||
|
||||
|
||||
info($maker->getCompiledHTML());
|
||||
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
@ -596,11 +591,9 @@ class PdfMakerDesignsTest extends TestCase
|
||||
->design(Plain::class)
|
||||
->build();
|
||||
|
||||
// exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
// info($maker->getCompiledHTML(true));
|
||||
|
||||
exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
info($maker->getCompiledHTML(true));
|
||||
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
@ -709,10 +702,7 @@ class PdfMakerDesignsTest extends TestCase
|
||||
->design(Hipster::class)
|
||||
->build();
|
||||
|
||||
// exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
// info($maker->getCompiledHTML(true));
|
||||
|
||||
info($maker->getCompiledHTML(true));
|
||||
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
@ -825,10 +815,7 @@ class PdfMakerDesignsTest extends TestCase
|
||||
->design(Elegant::class)
|
||||
->build();
|
||||
|
||||
// exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
// info($maker->getCompiledHTML(true));
|
||||
|
||||
info($maker->getCompiledHTML(true));
|
||||
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
@ -941,11 +928,8 @@ class PdfMakerDesignsTest extends TestCase
|
||||
->design(Creative::class)
|
||||
->build();
|
||||
|
||||
// exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
// info($maker->getCompiledHTML(true));
|
||||
|
||||
|
||||
info($maker->getCompiledHTML(true));
|
||||
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
@ -1051,11 +1035,7 @@ class PdfMakerDesignsTest extends TestCase
|
||||
->design(Playful::class)
|
||||
->build();
|
||||
|
||||
// exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
// info($maker->getCompiledHTML(true));
|
||||
|
||||
|
||||
info($maker->getCompiledHTML(true));
|
||||
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
|
@ -338,4 +338,39 @@ class PdfMakerTest extends TestCase
|
||||
|
||||
$this->assertStringContainsString('id="product-table"', $html);
|
||||
}
|
||||
|
||||
public function testWrapperHTMLWorks()
|
||||
{
|
||||
$design = new ExampleDesign();
|
||||
|
||||
$state = [
|
||||
'template' => [
|
||||
'product-table' => [
|
||||
'id' => 'product-table',
|
||||
'elements' => [
|
||||
['element' => 'p', 'content' => 'Example paragraph'],
|
||||
],
|
||||
],
|
||||
],
|
||||
'variables' => [
|
||||
'labels' => [],
|
||||
'values' => [],
|
||||
],
|
||||
'options' => [
|
||||
'all_pages_footer' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$maker = new PdfMaker($state);
|
||||
|
||||
$maker
|
||||
->design(ExampleDesign::class)
|
||||
->build();
|
||||
|
||||
exec('echo "" > storage/logs/laravel.log');
|
||||
|
||||
info($maker->getCompiledHTML(true));
|
||||
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
}
|
||||
|
@ -4,4 +4,5 @@
|
||||
<body class="m-10">
|
||||
<div id="header">$title</div>
|
||||
<table id="product-table"></table>
|
||||
<div id="footer">My awesome footer</div>
|
||||
</body>
|
127
tests/Feature/SystemLogApiTest.php
Normal file
127
tests/Feature/SystemLogApiTest.php
Normal file
@ -0,0 +1,127 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\DataMapper\DefaultSettings;
|
||||
use App\Models\Account;
|
||||
use App\Models\Client;
|
||||
use App\Models\ClientContact;
|
||||
use App\Models\Company;
|
||||
use App\Models\SystemLog;
|
||||
use App\Models\User;
|
||||
use App\Utils\Traits\MakesHash;
|
||||
use Faker\Factory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Foundation\Testing\WithFaker;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Tests\MockAccountData;
|
||||
use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @covers App\Http\Controllers\SystemLogController
|
||||
*/
|
||||
class SystemLogApiTest extends TestCase
|
||||
{
|
||||
use MakesHash;
|
||||
use DatabaseTransactions;
|
||||
use MockAccountData;
|
||||
|
||||
public function setUp() :void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->makeTestData();
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function testSystemLogRoutes()
|
||||
{
|
||||
|
||||
$sl = [
|
||||
'client_id' => $this->client->id,
|
||||
'company_id' => $this->company->id,
|
||||
'user_id' => $this->client->user_id,
|
||||
'log' => 'thelog',
|
||||
'category_id' => 1,
|
||||
'event_id' => 1,
|
||||
'type_id' => 1,
|
||||
];
|
||||
|
||||
SystemLog::create($sl);
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'X-API-SECRET' => config('ninja.api_secret'),
|
||||
'X-API-TOKEN' => $this->token
|
||||
])->get('/api/v1/system_logs');
|
||||
|
||||
|
||||
$response->assertStatus(200);
|
||||
|
||||
$arr = $response->json();
|
||||
|
||||
$this->assertTrue(count($arr['data']) >=1);
|
||||
|
||||
$hashed_id = $arr['data'][0]['id'];
|
||||
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'X-API-SECRET' => config('ninja.api_secret'),
|
||||
'X-API-TOKEN' => $this->token
|
||||
])->get('/api/v1/system_logs/' . $hashed_id);
|
||||
|
||||
$response->assertStatus(200);
|
||||
|
||||
$arr = $response->json();
|
||||
|
||||
$this->assertEquals($hashed_id, $arr['data']['id']);
|
||||
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'X-API-SECRET' => config('ninja.api_secret'),
|
||||
'X-API-TOKEN' => $this->token
|
||||
])->put('/api/v1/system_logs/' . $hashed_id, $sl)->assertStatus(400);
|
||||
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'X-API-SECRET' => config('ninja.api_secret'),
|
||||
'X-API-TOKEN' => $this->token
|
||||
])->delete('/api/v1/system_logs/' . $hashed_id)->assertStatus(400);
|
||||
}
|
||||
|
||||
public function testStoreRouteFails()
|
||||
{
|
||||
|
||||
$sl = [
|
||||
'client_id' => $this->client->id,
|
||||
'company_id' => $this->company->id,
|
||||
'user_id' => $this->client->user_id,
|
||||
'log' => 'thelog',
|
||||
'category_id' => 1,
|
||||
'event_id' => 1,
|
||||
'type_id' => 1,
|
||||
];
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'X-API-SECRET' => config('ninja.api_secret'),
|
||||
'X-API-TOKEN' => $this->token
|
||||
])->post('/api/v1/system_logs', $sl)->assertStatus(400);
|
||||
|
||||
}
|
||||
|
||||
public function testCreateRouteFails()
|
||||
{
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'X-API-SECRET' => config('ninja.api_secret'),
|
||||
'X-API-TOKEN' => $this->token
|
||||
])->get('/api/v1/system_logs/create')->assertStatus(400);
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user