mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-10 13:12:50 +01:00
Merge pull request #8478 from turbo124/v5-develop
?with filter query optimization
This commit is contained in:
commit
08d0f3655e
@ -22,7 +22,7 @@ class InvoiceReminderWasEmailed
|
||||
{
|
||||
use SerializesModels;
|
||||
|
||||
public function __construct(public InvoiceInvitation $invitation, public Company $company, public array $event_vars, public int $reminder)
|
||||
public function __construct(public InvoiceInvitation $invitation, public Company $company, public array $event_vars, public string $template)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ use Illuminate\Database\Eloquent\Builder;
|
||||
*/
|
||||
class ClientFilters extends QueryFilters
|
||||
{
|
||||
|
||||
/**
|
||||
* Filter by name.
|
||||
*
|
||||
|
@ -293,8 +293,16 @@ abstract class QueryFilters
|
||||
return $this->builder;
|
||||
}
|
||||
|
||||
public function with(string $value): Builder
|
||||
public function with(string $value = ''): Builder
|
||||
{
|
||||
if (strlen($value) == 0) {
|
||||
return $this->builder;
|
||||
}
|
||||
|
||||
if($this->with_property == 'id') {
|
||||
$value = $this->decodePrimaryKey($value);
|
||||
}
|
||||
|
||||
return $this->builder
|
||||
->orWhere($this->with_property, $value)
|
||||
->orderByRaw("{$this->with_property} = ? DESC", [$value])
|
||||
|
@ -48,48 +48,8 @@ class BankIntegrationController extends BaseController
|
||||
}
|
||||
|
||||
/**
|
||||
* @OA\Get(
|
||||
* path="/api/v1/bank_integrations",
|
||||
* operationId="getBankIntegrations",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Gets a list of bank_integrations",
|
||||
* description="Lists all bank integrations",
|
||||
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
|
||||
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||
* @OA\Parameter(ref="#/components/parameters/include"),
|
||||
* @OA\Parameter(ref="#/components/parameters/index"),
|
||||
* @OA\Parameter(
|
||||
* name="rows",
|
||||
* in="query",
|
||||
* description="The number of bank integrations to return",
|
||||
* example="50",
|
||||
* required=false,
|
||||
* @OA\Schema(
|
||||
* type="number",
|
||||
* format="integer",
|
||||
* ),
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response=200,
|
||||
* description="A list of bank integrations",
|
||||
* @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/BankIntegration"),
|
||||
* ),
|
||||
* @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"),
|
||||
* ),
|
||||
* )
|
||||
* @param Request $request
|
||||
* @return Response|mixed
|
||||
* @param BankIntegrationFilters $filters
|
||||
* @return Responsec
|
||||
*/
|
||||
public function index(BankIntegrationFilters $filters)
|
||||
{
|
||||
@ -105,47 +65,6 @@ class BankIntegrationController extends BaseController
|
||||
* @param BankIntegration $bank_integration
|
||||
* @return Response
|
||||
*
|
||||
*
|
||||
* @OA\Get(
|
||||
* path="/api/v1/bank_integrations/{id}",
|
||||
* operationId="showBankIntegration",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Shows a bank_integration",
|
||||
* description="Displays a bank_integration by id",
|
||||
* @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 BankIntegration Hashed ID",
|
||||
* example="D2J234DFA",
|
||||
* required=true,
|
||||
* @OA\Schema(
|
||||
* type="string",
|
||||
* format="string",
|
||||
* ),
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response=200,
|
||||
* description="Returns the bank_integration 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/BankIntegration"),
|
||||
* ),
|
||||
* @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(ShowBankIntegrationRequest $request, BankIntegration $bank_integration)
|
||||
{
|
||||
@ -160,47 +79,6 @@ class BankIntegrationController extends BaseController
|
||||
* @param BankIntegration $bank_integration
|
||||
* @return Response
|
||||
*
|
||||
*
|
||||
* @OA\Get(
|
||||
* path="/api/v1/bank_integrations/{id}/edit",
|
||||
* operationId="editBankIntegration",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Shows a bank_integration for editing",
|
||||
* description="Displays a bank_integration by id",
|
||||
* @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 BankIntegration Hashed ID",
|
||||
* example="D2J234DFA",
|
||||
* required=true,
|
||||
* @OA\Schema(
|
||||
* type="string",
|
||||
* format="string",
|
||||
* ),
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response=200,
|
||||
* description="Returns the bank_integration 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/BankIntegration"),
|
||||
* ),
|
||||
* @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 edit(EditBankIntegrationRequest $request, BankIntegration $bank_integration)
|
||||
{
|
||||
@ -214,48 +92,6 @@ class BankIntegrationController extends BaseController
|
||||
* @param BankIntegration $bank_integration
|
||||
* @return Response
|
||||
*
|
||||
*
|
||||
*
|
||||
* @OA\Put(
|
||||
* path="/api/v1/bank_integrations/{id}",
|
||||
* operationId="updateBankIntegration",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Updates a bank_integration",
|
||||
* description="Handles the updating of a bank_integration by id",
|
||||
* @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 BankIntegration Hashed ID",
|
||||
* example="D2J234DFA",
|
||||
* required=true,
|
||||
* @OA\Schema(
|
||||
* type="string",
|
||||
* format="string",
|
||||
* ),
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response=200,
|
||||
* description="Returns the bank_integration 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/BankIntegration"),
|
||||
* ),
|
||||
* @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 update(UpdateBankIntegrationRequest $request, BankIntegration $bank_integration)
|
||||
{
|
||||
@ -272,40 +108,14 @@ class BankIntegrationController extends BaseController
|
||||
* @return Response
|
||||
*
|
||||
*
|
||||
*
|
||||
* @OA\Get(
|
||||
* path="/api/v1/bank_integrations/create",
|
||||
* operationId="getBankIntegrationsCreate",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Gets a new blank bank_integration object",
|
||||
* description="Returns a blank object with default values",
|
||||
* @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 blank bank_integration 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/BankIntegration"),
|
||||
* ),
|
||||
* @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 create(CreateBankIntegrationRequest $request)
|
||||
{
|
||||
$bank_integration = BankIntegrationFactory::create(auth()->user()->company()->id, auth()->user()->id, auth()->user()->account_id);
|
||||
|
||||
/** @var \App\Models\User $user */
|
||||
$user = auth()->user();
|
||||
|
||||
$bank_integration = BankIntegrationFactory::create($user->company()->id, $user->id, $user->account_id);
|
||||
|
||||
return $this->itemResponse($bank_integration);
|
||||
}
|
||||
@ -316,42 +126,15 @@ class BankIntegrationController extends BaseController
|
||||
* @param StoreBankIntegrationRequest $request
|
||||
* @return Response
|
||||
*
|
||||
*
|
||||
*
|
||||
* @OA\Post(
|
||||
* path="/api/v1/bank_integrations",
|
||||
* operationId="storeBankIntegration",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Adds a bank_integration",
|
||||
* description="Adds an bank_integration to a company",
|
||||
* @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="Returns the saved bank_integration 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/BankIntegration"),
|
||||
* ),
|
||||
* @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 store(StoreBankIntegrationRequest $request)
|
||||
{
|
||||
|
||||
/** @var \App\Models\User $user */
|
||||
$user = auth()->user();
|
||||
|
||||
//stub to store the model
|
||||
$bank_integration = $this->bank_integration_repo->save($request->all(), BankIntegrationFactory::create(auth()->user()->company()->id, auth()->user()->id, auth()->user()->account_id));
|
||||
$bank_integration = $this->bank_integration_repo->save($request->all(), BankIntegrationFactory::create($user->company()->id, $user->id, $user->account_id));
|
||||
|
||||
return $this->itemResponse($bank_integration);
|
||||
}
|
||||
@ -363,47 +146,7 @@ class BankIntegrationController extends BaseController
|
||||
* @param BankIntegration $bank_integration
|
||||
* @return Response
|
||||
*
|
||||
*
|
||||
* @throws \Exception
|
||||
* @OA\Delete(
|
||||
* path="/api/v1/bank_integrations/{id}",
|
||||
* operationId="deleteBankIntegration",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Deletes a bank_integration",
|
||||
* description="Handles the deletion of a bank_integration by id",
|
||||
* @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 BankIntegration Hashed ID",
|
||||
* example="D2J234DFA",
|
||||
* required=true,
|
||||
* @OA\Schema(
|
||||
* type="string",
|
||||
* format="string",
|
||||
* ),
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response=200,
|
||||
* description="Returns a HTTP status",
|
||||
* @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\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 destroy(DestroyBankIntegrationRequest $request, BankIntegration $bank_integration)
|
||||
{
|
||||
@ -418,49 +161,6 @@ class BankIntegrationController extends BaseController
|
||||
*
|
||||
* @return Collection
|
||||
*
|
||||
* @OA\Post(
|
||||
* path="/api/v1/bank_integrations/bulk",
|
||||
* operationId="bulkBankIntegrations",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Performs bulk actions on an array of bank_integrations",
|
||||
* description="",
|
||||
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
|
||||
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||
* @OA\Parameter(ref="#/components/parameters/index"),
|
||||
* @OA\RequestBody(
|
||||
* description="Action paramters",
|
||||
* required=true,
|
||||
* @OA\MediaType(
|
||||
* mediaType="application/json",
|
||||
* @OA\Schema(
|
||||
* type="array",
|
||||
* @OA\Items(
|
||||
* type="integer",
|
||||
* description="Array of hashed IDs to be bulk 'actioned",
|
||||
* example="[0,1,2,3]",
|
||||
* ),
|
||||
* )
|
||||
* )
|
||||
* ),
|
||||
* @OA\Response(
|
||||
* response=200,
|
||||
* description="The Bulk Action response",
|
||||
* @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\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 bulk(BulkBankIntegrationRequest $request)
|
||||
{
|
||||
@ -485,43 +185,19 @@ class BankIntegrationController extends BaseController
|
||||
* Return the remote list of accounts stored on the third party provider.
|
||||
*
|
||||
* @return Response
|
||||
*
|
||||
* @OA\Post(
|
||||
* path="/api/v1/bank_integrations/refresh_accounts",
|
||||
* operationId="getRefreshAccounts",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Gets the list of accounts from the remote server",
|
||||
* description="Adds an bank_integration to a company",
|
||||
* @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="Returns the saved bank_integration 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/BankIntegration"),
|
||||
* ),
|
||||
* @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 refreshAccounts(AdminBankIntegrationRequest $request)
|
||||
{
|
||||
// As yodlee is the first integration we don't need to perform switches yet, however
|
||||
// if we add additional providers we can reuse this class
|
||||
|
||||
$bank_account_id = auth()->user()->account->bank_integration_account_id;
|
||||
|
||||
/** @var \App\Models\User $user */
|
||||
$user = auth()->user();
|
||||
|
||||
$user_account = $user->account;
|
||||
|
||||
$bank_account_id = $user_account->bank_integration_account_id;
|
||||
|
||||
if (!$bank_account_id) {
|
||||
return response()->json(['message' => 'Not yet authenticated with Bank Integration service'], 400);
|
||||
@ -532,11 +208,11 @@ class BankIntegrationController extends BaseController
|
||||
$accounts = $yodlee->getAccounts();
|
||||
|
||||
foreach ($accounts as $account) {
|
||||
if (!BankIntegration::withTrashed()->where('bank_account_id', $account['id'])->where('company_id', auth()->user()->company()->id)->exists()) {
|
||||
if (!BankIntegration::withTrashed()->where('bank_account_id', $account['id'])->where('company_id', $user->company()->id)->exists()) {
|
||||
$bank_integration = new BankIntegration();
|
||||
$bank_integration->company_id = auth()->user()->company()->id;
|
||||
$bank_integration->account_id = auth()->user()->account_id;
|
||||
$bank_integration->user_id = auth()->user()->id;
|
||||
$bank_integration->company_id = $user->company()->id;
|
||||
$bank_integration->account_id = $user->account_id;
|
||||
$bank_integration->user_id = $user->id;
|
||||
$bank_integration->bank_account_id = $account['id'];
|
||||
$bank_integration->bank_account_type = $account['account_type'];
|
||||
$bank_integration->bank_account_name = $account['account_name'];
|
||||
@ -551,17 +227,15 @@ class BankIntegrationController extends BaseController
|
||||
}
|
||||
}
|
||||
|
||||
$account = auth()->user()->account;
|
||||
|
||||
if (Cache::get("throttle_polling:{$account->key}")) {
|
||||
return response()->json(BankIntegration::query()->company(), 200);
|
||||
}
|
||||
|
||||
$account->bank_integrations->each(function ($bank_integration) use ($account) {
|
||||
ProcessBankTransactions::dispatch($account->bank_integration_account_id, $bank_integration);
|
||||
$user_account->bank_integrations->each(function ($bank_integration) use ($user_account) {
|
||||
ProcessBankTransactions::dispatch($user_account->bank_integration_account_id, $bank_integration);
|
||||
});
|
||||
|
||||
Cache::put("throttle_polling:{$account->key}", true, 300);
|
||||
Cache::put("throttle_polling:{$user_account->key}", true, 300);
|
||||
|
||||
return response()->json(BankIntegration::query()->company(), 200);
|
||||
}
|
||||
@ -572,40 +246,16 @@ class BankIntegrationController extends BaseController
|
||||
*
|
||||
* @return Response
|
||||
*
|
||||
* @OA\Post(
|
||||
* path="/api/v1/bank_integrations/remove_account/account_id",
|
||||
* operationId="getRemoveAccount",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Removes an account from the integration",
|
||||
* description="Removes an account from the integration",
|
||||
* @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="Returns the bank_integration 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/BankIntegration"),
|
||||
* ),
|
||||
* @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 removeAccount(AdminBankIntegrationRequest $request, $acc_id)
|
||||
{
|
||||
$bank_account_id = auth()->user()->account->bank_integration_account_id;
|
||||
/** @var \App\Models\User $user */
|
||||
$user = auth()->user();
|
||||
|
||||
$account = $user->account;
|
||||
|
||||
$bank_account_id = $account->bank_integration_account_id;
|
||||
|
||||
if (!$bank_account_id) {
|
||||
return response()->json(['message' => 'Not yet authenticated with Bank Integration service'], 400);
|
||||
@ -628,40 +278,14 @@ class BankIntegrationController extends BaseController
|
||||
*
|
||||
* @return Response
|
||||
*
|
||||
* @OA\Post(
|
||||
* path="/api/v1/bank_integrations/get_transactions/account_id",
|
||||
* operationId="getAccountTransactions",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Retrieve transactions for a account",
|
||||
* description="Retrieve transactions for a account",
|
||||
* @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="Retrieve transactions for a account",
|
||||
* @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/BankIntegration"),
|
||||
* ),
|
||||
* @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 getTransactions(AdminBankIntegrationRequest $request)
|
||||
{
|
||||
auth()->user()->account->bank_integrations->each(function ($bank_integration) {
|
||||
(new ProcessBankTransactions(auth()->user()->account->bank_integration_account_id, $bank_integration))->handle();
|
||||
/** @var \App\Models\User $user */
|
||||
$user = auth()->user();
|
||||
|
||||
$user->account->bank_integrations->each(function ($bank_integration) use ($user){
|
||||
(new ProcessBankTransactions($user->account->bank_integration_account_id, $bank_integration))->handle();
|
||||
});
|
||||
|
||||
return response()->json(['message' => 'Fetching transactions....'], 200);
|
||||
|
@ -136,7 +136,10 @@ class EmailController extends BaseController
|
||||
$mo->email_template_body = $request->input('template');
|
||||
$mo->email_template_subject = str_replace("template", "subject", $request->input('template'));
|
||||
|
||||
if ($request->has('cc_email') && $request->cc_email) {
|
||||
/** @var \App\Models\User $user */
|
||||
$user = auth()->user();
|
||||
|
||||
if ($request->has('cc_email') && $request->cc_email && (Ninja::isSelfHost() || $user->account->isPaidHostedClient())) {
|
||||
$mo->cc[] = new Address($request->cc_email);
|
||||
}
|
||||
|
||||
@ -144,8 +147,6 @@ class EmailController extends BaseController
|
||||
if (! $invitation->contact->trashed() && $invitation->contact->email) {
|
||||
$entity_obj->service()->markSent()->save();
|
||||
|
||||
// EmailEntity::dispatch($invitation->fresh(), $invitation->company, $template, $data);
|
||||
|
||||
$mo->invitation_id = $invitation->id;
|
||||
|
||||
Email::dispatch($mo, $invitation->company);
|
||||
|
@ -92,7 +92,11 @@ class SendEmailRequest extends Request
|
||||
|
||||
/*Make sure we have all the require ingredients to send a template*/
|
||||
if (array_key_exists('entity', $input) && array_key_exists('entity_id', $input) && is_string($input['entity']) && $input['entity_id']) {
|
||||
$company = auth()->user()->company();
|
||||
|
||||
/** @var \App\Models\User $user */
|
||||
$user = auth()->user();
|
||||
|
||||
$company = $user->company();
|
||||
|
||||
$entity = $input['entity'];
|
||||
|
||||
@ -100,7 +104,7 @@ class SendEmailRequest extends Request
|
||||
$entity_obj = $entity::whereId($input['entity_id'])->withTrashed()->company()->first();
|
||||
|
||||
/* Check object, check user and company id is same as users, and check user can edit the object */
|
||||
if ($entity_obj && ($company->id == $entity_obj->company_id) && auth()->user()->can('edit', $entity_obj)) {
|
||||
if ($entity_obj && ($company->id == $entity_obj->company_id) && $user->can('edit', $entity_obj)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -37,6 +37,8 @@ class InvoiceEmailedNotification implements ShouldQueue
|
||||
*/
|
||||
public function handle($event)
|
||||
{
|
||||
nlog($event->template);
|
||||
|
||||
MultiDB::setDb($event->company->db);
|
||||
|
||||
$first_notification_sent = true;
|
||||
@ -61,6 +63,20 @@ class InvoiceEmailedNotification implements ShouldQueue
|
||||
if (($key = array_search('mail', $methods)) !== false) {
|
||||
unset($methods[$key]);
|
||||
|
||||
// $template = $event->template ?? '';
|
||||
|
||||
// if(isset($event->reminder)){
|
||||
|
||||
// $template = match($event->reminder){
|
||||
// 63 => 'reminder1',
|
||||
// 64 => 'reminder2',
|
||||
// 65 => 'reminder3',
|
||||
// 66 => 'endless_reminder',
|
||||
// default => ''
|
||||
// };
|
||||
|
||||
// }
|
||||
|
||||
$nmo = new NinjaMailerObject;
|
||||
$nmo->mailable = new NinjaMailer((new EntitySentObject($event->invitation, 'invoice', $event->template))->build());
|
||||
$nmo->company = $invoice->company;
|
||||
|
@ -136,6 +136,12 @@ class EntitySentObject
|
||||
$this->template_subject = 'texts.notification_purchase_order_sent_subject';
|
||||
$this->template_body = 'texts.notification_purchase_order_sent';
|
||||
break;
|
||||
case 'custom1':
|
||||
case 'custom2':
|
||||
case 'custom3':
|
||||
$this->template_subject = 'texts.notification_invoice_custom_sent_subject';
|
||||
$this->template_body = 'texts.notification_invoice_sent';
|
||||
break;
|
||||
default:
|
||||
$this->template_subject = 'texts.notification_invoice_sent_subject';
|
||||
$this->template_body = 'texts.notification_invoice_sent';
|
||||
|
@ -39,6 +39,7 @@ use Illuminate\Support\Str;
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|BaseModel withTrashed()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|BaseModel scopeExclude()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|BaseModel find()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereIn()
|
||||
* @method \App\Models\Company company()
|
||||
* @method int companyId()
|
||||
* @method Builder|static exclude($columns)
|
||||
|
@ -801,22 +801,29 @@ class Invoice extends BaseModel
|
||||
|
||||
public function entityEmailEvent($invitation, $reminder_template, $template = '')
|
||||
{
|
||||
nlog($template);
|
||||
|
||||
switch ($reminder_template) {
|
||||
case 'invoice':
|
||||
event(new InvoiceWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), $template));
|
||||
break;
|
||||
case 'reminder1':
|
||||
event(new InvoiceReminderWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), Activity::INVOICE_REMINDER1_SENT));
|
||||
event(new InvoiceReminderWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), $template));
|
||||
break;
|
||||
case 'reminder2':
|
||||
event(new InvoiceReminderWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), Activity::INVOICE_REMINDER2_SENT));
|
||||
event(new InvoiceReminderWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), $template));
|
||||
break;
|
||||
case 'reminder3':
|
||||
event(new InvoiceReminderWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), Activity::INVOICE_REMINDER3_SENT));
|
||||
event(new InvoiceReminderWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), $template));
|
||||
break;
|
||||
case 'reminder_endless':
|
||||
case 'endless_reminder':
|
||||
event(new InvoiceReminderWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), Activity::INVOICE_REMINDER_ENDLESS_SENT));
|
||||
event(new InvoiceReminderWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), $template));
|
||||
break;
|
||||
case 'custom1':
|
||||
case 'custom2':
|
||||
case 'custom3':
|
||||
event(new InvoiceReminderWasEmailed($invitation, $invitation->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null), $template));
|
||||
break;
|
||||
default:
|
||||
// code...
|
||||
|
@ -25,6 +25,8 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|StaticModel newModelQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|StaticModel newQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|StaticModel query()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|StaticModel find()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|StaticModel findOrFail()
|
||||
* @mixin \Eloquent
|
||||
*/
|
||||
class StaticModel extends Model
|
||||
@ -50,7 +52,10 @@ class StaticModel extends Model
|
||||
*/
|
||||
public function scopeCompany($query)
|
||||
{
|
||||
$query->where('company_id', auth()->user()->companyId());
|
||||
/** @var \App\Models\User $user */
|
||||
$user = auth()->user();
|
||||
|
||||
$query->where('company_id', $user->companyId());
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
@ -40,15 +40,15 @@ class AppServiceProvider extends ServiceProvider
|
||||
*/
|
||||
public function boot()
|
||||
{
|
||||
// DB::listen(function($query) {
|
||||
// nlog(
|
||||
// $query->sql,
|
||||
// [
|
||||
// 'bindings' => $query->bindings,
|
||||
// 'time' => $query->time
|
||||
// ]
|
||||
// );
|
||||
// });
|
||||
\DB::listen(function($query) {
|
||||
nlog(
|
||||
$query->sql,
|
||||
[
|
||||
'bindings' => $query->bindings,
|
||||
'time' => $query->time
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// Model::preventLazyLoading(
|
||||
// !$this->app->isProduction()
|
||||
|
37
database/migrations/2023_04_27_045639_add_kmher_language.php
Normal file
37
database/migrations/2023_04_27_045639_add_kmher_language.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
use App\Models\Language;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
|
||||
Language::unguard();
|
||||
|
||||
$language = Language::find(38);
|
||||
|
||||
if (! $language) {
|
||||
Language::create(['id' => 38, 'name' => 'Khmer', 'locale' => 'km_KH']);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
}
|
||||
};
|
@ -57,6 +57,12 @@ class LanguageSeeder extends Seeder
|
||||
['id' => 30, 'name' => 'Arabic', 'locale' => 'ar'],
|
||||
['id' => 31, 'name' => 'Persian', 'locale' => 'fa'],
|
||||
['id' => 32, 'name' => 'Latvian', 'locale' => 'lv_LV'],
|
||||
['id' => 33, 'name' => 'Serbian', 'locale' => 'sr'],
|
||||
['id' => 34, 'name' => 'Slovak', 'locale' => 'sk'],
|
||||
['id' => 35, 'name' => 'Estonian', 'locale' => 'et'],
|
||||
['id' => 36, 'name' => 'Bulgarian', 'locale' => 'bg'],
|
||||
['id' => 37, 'name' => 'Hebrew', 'locale' => 'he'],
|
||||
['id' => 38, 'name' => 'Khmer', 'locale' => 'km_KH'],
|
||||
];
|
||||
|
||||
foreach ($languages as $language) {
|
||||
@ -69,29 +75,5 @@ class LanguageSeeder extends Seeder
|
||||
}
|
||||
}
|
||||
|
||||
if (!Language::find(33)) {
|
||||
$serbian = ['id' => 33, 'name' => 'Serbian', 'locale' => 'sr'];
|
||||
Language::create($serbian);
|
||||
}
|
||||
|
||||
if (!Language::find(34)) {
|
||||
$slovak = ['id' => 34, 'name' => 'Slovak', 'locale' => 'sk'];
|
||||
Language::create($slovak);
|
||||
}
|
||||
|
||||
if (!Language::find(35)) {
|
||||
$estonia = ['id' => 35, 'name' => 'Estonian', 'locale' => 'et'];
|
||||
Language::create($estonia);
|
||||
}
|
||||
|
||||
if (!Language::find(36)) {
|
||||
$bulgarian = ['id' => 36, 'name' => 'Bulgarian', 'locale' => 'bg'];
|
||||
Language::create($bulgarian);
|
||||
}
|
||||
|
||||
if (!Language::find(37)) {
|
||||
$hebrew = ['id' => 37, 'name' => 'Hebrew', 'locale' => 'he'];
|
||||
Language::create($hebrew);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5002,7 +5002,7 @@ $LANG = array(
|
||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||
'xinvoice_payable' => 'مستحق الدفع paydate: صافي أيام الدفع payeddue: تاريخ الدفع',
|
||||
'xinvoice_no_buyers_reference' => "لم يتم إعطاء إشارة للمشتري",
|
||||
'xinvoice_online_payment' => 'يجب دفع الفاتورة عبر الإنترنت من خلال الرابط المقدم',
|
||||
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
|
||||
'pre_payment' => 'الدفع المسبق',
|
||||
'number_of_payments' => 'عدد الدفعات',
|
||||
'number_of_payments_helper' => 'عدد المرات التي سيتم فيها إجراء هذه الدفعة',
|
||||
@ -5086,6 +5086,8 @@ $LANG = array(
|
||||
'services' => 'Services',
|
||||
'shipping' => 'Shipping',
|
||||
'tax_exempt' => 'Tax Exempt',
|
||||
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
@ -4983,7 +4983,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
|
||||
'payment_type_Interac E Transfer' => 'Interac E-Übertragung',
|
||||
'xinvoice_payable' => 'Zahlbar innerhalb von :payeddue Tagen netto bis :paydate',
|
||||
'xinvoice_no_buyers_reference' => "Keine Käuferreferenz angegeben",
|
||||
'xinvoice_online_payment' => 'Die Rechnung muss online über den bereitgestellten Link bezahlt werden',
|
||||
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
|
||||
'pre_payment' => 'Vorauszahlung',
|
||||
'number_of_payments' => 'Anzahl der Zahlungen',
|
||||
'number_of_payments_helper' => 'Die Häufigkeit, mit der diese Zahlung erfolgt',
|
||||
@ -5067,6 +5067,8 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
|
||||
'services' => 'Services',
|
||||
'shipping' => 'Shipping',
|
||||
'tax_exempt' => 'Tax Exempt',
|
||||
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
@ -4012,6 +4012,7 @@ $LANG = array(
|
||||
'notification_invoice_reminder1_sent_subject' => 'Reminder 1 for Invoice :invoice was sent to :client',
|
||||
'notification_invoice_reminder2_sent_subject' => 'Reminder 2 for Invoice :invoice was sent to :client',
|
||||
'notification_invoice_reminder3_sent_subject' => 'Reminder 3 for Invoice :invoice was sent to :client',
|
||||
'notification_invoice_custom_sent_subject' => 'Custom reminder for Invoice :invoice was sent to :client',
|
||||
'notification_invoice_reminder_endless_sent_subject' => 'Endless reminder for Invoice :invoice was sent to :client',
|
||||
'assigned_user' => 'Assigned User',
|
||||
'setup_steps_notice' => 'To proceed to next step, make sure you test each section.',
|
||||
@ -5066,7 +5067,7 @@ $LANG = array(
|
||||
'shipping' => 'Shipping',
|
||||
'tax_exempt' => 'Tax Exempt',
|
||||
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
|
||||
|
||||
'lang_Khmer' => 'Khmer',
|
||||
);
|
||||
|
||||
|
||||
|
@ -4979,7 +4979,7 @@ $LANG = array(
|
||||
'payment_type_Interac E Transfer' => 'Transferencia Interac E',
|
||||
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
|
||||
'xinvoice_no_buyers_reference' => "No se da referencia del comprador",
|
||||
'xinvoice_online_payment' => 'La factura debe pagarse en línea a través del enlace provisto',
|
||||
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
|
||||
'pre_payment' => 'Prepago',
|
||||
'number_of_payments' => 'numero de pagos',
|
||||
'number_of_payments_helper' => 'El número de veces que se realizará este pago.',
|
||||
@ -5063,6 +5063,8 @@ $LANG = array(
|
||||
'services' => 'Services',
|
||||
'shipping' => 'Shipping',
|
||||
'tax_exempt' => 'Tax Exempt',
|
||||
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
@ -4971,7 +4971,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c
|
||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||
'xinvoice_payable' => 'Pagadero dentro de :payeddue días de pago vencido neto hasta :paydate',
|
||||
'xinvoice_no_buyers_reference' => "No se da la referencia del comprador",
|
||||
'xinvoice_online_payment' => 'La factura debe pagarse en línea a través del enlace proporcionado.',
|
||||
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
|
||||
'pre_payment' => 'Prepago',
|
||||
'number_of_payments' => 'Numero de pagos',
|
||||
'number_of_payments_helper' => 'El número de veces que se realizará este pago.',
|
||||
@ -5055,6 +5055,8 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c
|
||||
'services' => 'Servicios',
|
||||
'shipping' => 'Envío',
|
||||
'tax_exempt' => 'Exento de impuestos',
|
||||
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
@ -4975,7 +4975,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
||||
'payment_type_Interac E Transfer' => 'Virement Interac E',
|
||||
'xinvoice_payable' => 'Payable sous :payeddue days net jusqu\'au :paydate',
|
||||
'xinvoice_no_buyers_reference' => "Aucune référence d'acheteur donnée",
|
||||
'xinvoice_online_payment' => 'La facture doit être payée en ligne via le lien fourni',
|
||||
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
|
||||
'pre_payment' => 'Prépaiement',
|
||||
'number_of_payments' => 'Nombre de paiements',
|
||||
'number_of_payments_helper' => 'Le nombre de fois que ce paiement sera effectué',
|
||||
@ -5059,6 +5059,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
||||
'services' => 'Services',
|
||||
'shipping' => 'Shipping',
|
||||
'tax_exempt' => 'Tax Exempt',
|
||||
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
@ -4882,7 +4882,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
||||
'email_queued' => 'Courriel en file d\'attente',
|
||||
'clone_to_recurring_invoice' => 'Dupliquer en facture récurrente',
|
||||
'inventory_threshold' => 'Seuil d\'inventaire',
|
||||
'emailed_statement' => 'L\'état de compte a été mis en file d\'attente pour l\'envoi',
|
||||
'emailed_statement' => 'Le relevé a été mis en file d\'attente pour l\'envoi',
|
||||
'show_email_footer' => 'Afficher le pied de page du courriel',
|
||||
'invoice_task_hours' => 'Facturer les heures de tâches',
|
||||
'invoice_task_hours_help' => 'Ajouter ces heures aux articles de la facture',
|
||||
@ -4910,7 +4910,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
||||
'all_clients' => 'Tous les clients',
|
||||
'show_aging_table' => 'Afficher la liste des impayés',
|
||||
'show_payments_table' => 'Afficher la liste des paiements',
|
||||
'email_statement' => 'Envoyer par courriel l\'état de compte',
|
||||
'email_statement' => 'Envoyer le relevé par courriel',
|
||||
'once' => 'Une fois',
|
||||
'schedules' => 'Planifications',
|
||||
'new_schedule' => 'Nouvelle planification',
|
||||
@ -4973,7 +4973,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
||||
'payment_type_Interac E Transfer' => 'Transfert Interac',
|
||||
'xinvoice_payable' => 'Payable d\'ici :payeddue jours jusqu\'à :paydate',
|
||||
'xinvoice_no_buyers_reference' => "Aucune référence de l'acheteur fournie",
|
||||
'xinvoice_online_payment' => 'Cette facture doit être payée en ligne en utilisant le lien fourni',
|
||||
'xinvoice_online_payment' => 'Cette facture doit être payée en ligne en suivant le lien fourni',
|
||||
'pre_payment' => 'Prépaiement',
|
||||
'number_of_payments' => 'Nombre de paiements',
|
||||
'number_of_payments_helper' => 'Nombre de fois que ce paiement sera fait',
|
||||
@ -5037,7 +5037,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
||||
'tax_all' => 'Tout taxer',
|
||||
'tax_selected' => 'Taxe sélectionnée',
|
||||
'version' => 'version',
|
||||
'seller_subregion' => 'Sous-région du vendeur',
|
||||
'seller_subregion' => 'Province du vendeur',
|
||||
'calculate_taxes' => 'Calculer les taxes',
|
||||
'calculate_taxes_help' => 'Calcul automatique des taxes à la sauvegarde des factures',
|
||||
'link_expenses' => 'Lier les dépenses',
|
||||
@ -5057,6 +5057,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
|
||||
'services' => 'Services',
|
||||
'shipping' => 'Livraison',
|
||||
'tax_exempt' => 'Exemption de taxes',
|
||||
'late_fee_added_locked_invoice' => 'Les frais de retard pour la facture :invoice ont été ajoutés le :date',
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
@ -4966,7 +4966,7 @@ $LANG = array(
|
||||
'payment_type_Interac E Transfer' => 'Interac E Trasferimento',
|
||||
'xinvoice_payable' => 'Pagabile entro :payeddue giorni netti fino :paydate',
|
||||
'xinvoice_no_buyers_reference' => "Nessun riferimento dell'acquirente fornito",
|
||||
'xinvoice_online_payment' => 'La fattura deve essere pagata online tramite il link fornito',
|
||||
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
|
||||
'pre_payment' => 'Pagamento anticipato',
|
||||
'number_of_payments' => 'Numero di pagamenti',
|
||||
'number_of_payments_helper' => 'Il numero di volte in cui verrà effettuato questo pagamento',
|
||||
@ -5050,6 +5050,8 @@ $LANG = array(
|
||||
'services' => 'Services',
|
||||
'shipping' => 'Shipping',
|
||||
'tax_exempt' => 'Tax Exempt',
|
||||
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
20
lang/km_KH/auth.php
Normal file
20
lang/km_KH/auth.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Authentication Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used during authentication for various
|
||||
| messages that we need to display to the user. You are free to modify
|
||||
| these language lines according to your application's requirements.
|
||||
|
|
||||
*/
|
||||
|
||||
'failed' => 'These credentials do not match our records.',
|
||||
'password' => 'The provided password is incorrect.',
|
||||
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
|
||||
|
||||
];
|
13
lang/km_KH/help.php
Normal file
13
lang/km_KH/help.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
$lang = [
|
||||
'client_dashboard' => 'Message to be displayed on clients dashboard',
|
||||
'client_currency' => 'The client currency.',
|
||||
'client_language' => 'The client language.',
|
||||
'client_payment_terms' => 'The client payment terms.',
|
||||
'client_paid_invoice' => 'Message to be displayed on a clients paid invoice screen',
|
||||
'client_unpaid_invoice' => 'Message to be displayed on a clients unpaid invoice screen',
|
||||
'client_unapproved_quote' => 'Message to be displayed on a clients unapproved quote screen',
|
||||
];
|
||||
|
||||
return $lang;
|
19
lang/km_KH/pagination.php
Normal file
19
lang/km_KH/pagination.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Pagination Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used by the paginator library to build
|
||||
| the simple pagination links. You are free to change them to anything
|
||||
| you want to customize your views to better match your application.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« Previous',
|
||||
'next' => 'Next »',
|
||||
|
||||
];
|
23
lang/km_KH/passwords.php
Normal file
23
lang/km_KH/passwords.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Password Reset Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are the default lines which match reasons
|
||||
| that are given by the password broker for a password update attempt
|
||||
| has failed, such as for an invalid token or invalid new password.
|
||||
|
|
||||
*/
|
||||
|
||||
'password' => 'Passwords must be at least six characters and match the confirmation.',
|
||||
'reset' => 'Your password has been reset!',
|
||||
'sent' => 'We have e-mailed your password reset link!',
|
||||
'token' => 'This password reset token is invalid.',
|
||||
'user' => "We can't find a user with that e-mail address.",
|
||||
'throttled' => 'You have requested password reset recently, please check your email.',
|
||||
|
||||
];
|
5048
lang/km_KH/texts.php
Normal file
5048
lang/km_KH/texts.php
Normal file
File diff suppressed because it is too large
Load Diff
170
lang/km_KH/validation.php
Normal file
170
lang/km_KH/validation.php
Normal file
@ -0,0 +1,170 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines contain the default error messages used by
|
||||
| the validator class. Some of these rules have multiple versions such
|
||||
| as the size rules. Feel free to tweak each of these messages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => 'The :attribute must be accepted.',
|
||||
'accepted_if' => 'The :attribute must be accepted when :other is :value.',
|
||||
'active_url' => 'The :attribute is not a valid URL.',
|
||||
'after' => 'The :attribute must be a date after :date.',
|
||||
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
|
||||
'alpha' => 'The :attribute must only contain letters.',
|
||||
'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.',
|
||||
'alpha_num' => 'The :attribute must only contain letters and numbers.',
|
||||
'array' => 'The :attribute must be an array.',
|
||||
'before' => 'The :attribute must be a date before :date.',
|
||||
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
|
||||
'between' => [
|
||||
'array' => 'The :attribute must have between :min and :max items.',
|
||||
'file' => 'The :attribute must be between :min and :max kilobytes.',
|
||||
'numeric' => 'The :attribute must be between :min and :max.',
|
||||
'string' => 'The :attribute must be between :min and :max characters.',
|
||||
],
|
||||
'boolean' => 'The :attribute field must be true or false.',
|
||||
'confirmed' => 'The :attribute confirmation does not match.',
|
||||
'current_password' => 'The password is incorrect.',
|
||||
'date' => 'The :attribute is not a valid date.',
|
||||
'date_equals' => 'The :attribute must be a date equal to :date.',
|
||||
'date_format' => 'The :attribute does not match the format :format.',
|
||||
'declined' => 'The :attribute must be declined.',
|
||||
'declined_if' => 'The :attribute must be declined when :other is :value.',
|
||||
'different' => 'The :attribute and :other must be different.',
|
||||
'digits' => 'The :attribute must be :digits digits.',
|
||||
'digits_between' => 'The :attribute must be between :min and :max digits.',
|
||||
'dimensions' => 'The :attribute has invalid image dimensions.',
|
||||
'distinct' => 'The :attribute field has a duplicate value.',
|
||||
'email' => 'The :attribute must be a valid email address.',
|
||||
'ends_with' => 'The :attribute must end with one of the following: :values.',
|
||||
'enum' => 'The selected :attribute is invalid.',
|
||||
'exists' => 'The selected :attribute is invalid.',
|
||||
'file' => 'The :attribute must be a file.',
|
||||
'filled' => 'The :attribute field must have a value.',
|
||||
'gt' => [
|
||||
'array' => 'The :attribute must have more than :value items.',
|
||||
'file' => 'The :attribute must be greater than :value kilobytes.',
|
||||
'numeric' => 'The :attribute must be greater than :value.',
|
||||
'string' => 'The :attribute must be greater than :value characters.',
|
||||
],
|
||||
'gte' => [
|
||||
'array' => 'The :attribute must have :value items or more.',
|
||||
'file' => 'The :attribute must be greater than or equal to :value kilobytes.',
|
||||
'numeric' => 'The :attribute must be greater than or equal to :value.',
|
||||
'string' => 'The :attribute must be greater than or equal to :value characters.',
|
||||
],
|
||||
'image' => 'The :attribute must be an image.',
|
||||
'in' => 'The selected :attribute is invalid.',
|
||||
'in_array' => 'The :attribute field does not exist in :other.',
|
||||
'integer' => 'The :attribute must be an integer.',
|
||||
'ip' => 'The :attribute must be a valid IP address.',
|
||||
'ipv4' => 'The :attribute must be a valid IPv4 address.',
|
||||
'ipv6' => 'The :attribute must be a valid IPv6 address.',
|
||||
'json' => 'The :attribute must be a valid JSON string.',
|
||||
'lt' => [
|
||||
'array' => 'The :attribute must have less than :value items.',
|
||||
'file' => 'The :attribute must be less than :value kilobytes.',
|
||||
'numeric' => 'The :attribute must be less than :value.',
|
||||
'string' => 'The :attribute must be less than :value characters.',
|
||||
],
|
||||
'lte' => [
|
||||
'array' => 'The :attribute must not have more than :value items.',
|
||||
'file' => 'The :attribute must be less than or equal to :value kilobytes.',
|
||||
'numeric' => 'The :attribute must be less than or equal to :value.',
|
||||
'string' => 'The :attribute must be less than or equal to :value characters.',
|
||||
],
|
||||
'mac_address' => 'The :attribute must be a valid MAC address.',
|
||||
'max' => [
|
||||
'array' => 'The :attribute must not have more than :max items.',
|
||||
'file' => 'The :attribute must not be greater than :max kilobytes.',
|
||||
'numeric' => 'The :attribute must not be greater than :max.',
|
||||
'string' => 'The :attribute must not be greater than :max characters.',
|
||||
],
|
||||
'mimes' => 'The :attribute must be a file of type: :values.',
|
||||
'mimetypes' => 'The :attribute must be a file of type: :values.',
|
||||
'min' => [
|
||||
'array' => 'The :attribute must have at least :min items.',
|
||||
'file' => 'The :attribute must be at least :min kilobytes.',
|
||||
'numeric' => 'The :attribute must be at least :min.',
|
||||
'string' => 'The :attribute must be at least :min characters.',
|
||||
],
|
||||
'multiple_of' => 'The :attribute must be a multiple of :value.',
|
||||
'not_in' => 'The selected :attribute is invalid.',
|
||||
'not_regex' => 'The :attribute format is invalid.',
|
||||
'numeric' => 'The :attribute must be a number.',
|
||||
'password' => [
|
||||
'letters' => 'The :attribute must contain at least one letter.',
|
||||
'mixed' => 'The :attribute must contain at least one uppercase and one lowercase letter.',
|
||||
'numbers' => 'The :attribute must contain at least one number.',
|
||||
'symbols' => 'The :attribute must contain at least one symbol.',
|
||||
'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
|
||||
],
|
||||
'present' => 'The :attribute field must be present.',
|
||||
'prohibited' => 'The :attribute field is prohibited.',
|
||||
'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
|
||||
'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
|
||||
'prohibits' => 'The :attribute field prohibits :other from being present.',
|
||||
'regex' => 'The :attribute format is invalid.',
|
||||
'required' => 'The :attribute field is required.',
|
||||
'required_array_keys' => 'The :attribute field must contain entries for: :values.',
|
||||
'required_if' => 'The :attribute field is required when :other is :value.',
|
||||
'required_unless' => 'The :attribute field is required unless :other is in :values.',
|
||||
'required_with' => 'The :attribute field is required when :values is present.',
|
||||
'required_with_all' => 'The :attribute field is required when :values are present.',
|
||||
'required_without' => 'The :attribute field is required when :values is not present.',
|
||||
'required_without_all' => 'The :attribute field is required when none of :values are present.',
|
||||
'same' => 'The :attribute and :other must match.',
|
||||
'size' => [
|
||||
'array' => 'The :attribute must contain :size items.',
|
||||
'file' => 'The :attribute must be :size kilobytes.',
|
||||
'numeric' => 'The :attribute must be :size.',
|
||||
'string' => 'The :attribute must be :size characters.',
|
||||
],
|
||||
'starts_with' => 'The :attribute must start with one of the following: :values.',
|
||||
'doesnt_start_with' => 'The :attribute may not start with one of the following: :values.',
|
||||
'string' => 'The :attribute must be a string.',
|
||||
'timezone' => 'The :attribute must be a valid timezone.',
|
||||
'unique' => 'The :attribute has already been taken.',
|
||||
'uploaded' => 'The :attribute failed to upload.',
|
||||
'url' => 'The :attribute must be a valid URL.',
|
||||
'uuid' => 'The :attribute must be a valid UUID.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may specify custom validation messages for attributes using the
|
||||
| convention "attribute.rule" to name the lines. This makes it quick to
|
||||
| specify a specific custom language line for a given attribute rule.
|
||||
|
|
||||
*/
|
||||
|
||||
'custom' => [
|
||||
'attribute-name' => [
|
||||
'rule-name' => 'custom-message',
|
||||
],
|
||||
],
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Attributes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used to swap our attribute placeholder
|
||||
| with something more reader friendly such as "E-Mail Address" instead
|
||||
| of "email". This simply helps us make our message more expressive.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
];
|
@ -4975,7 +4975,7 @@ Email: :email<b><br><b>',
|
||||
'payment_type_Interac E Transfer' => 'Interac E-overdracht',
|
||||
'xinvoice_payable' => 'Te betalen binnen :payeddue vervaldagen netto tot :paydate',
|
||||
'xinvoice_no_buyers_reference' => "Geen kopersreferentie opgegeven",
|
||||
'xinvoice_online_payment' => 'De factuur dient online betaald te worden via de voorziene link',
|
||||
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
|
||||
'pre_payment' => 'Vooruitbetaling',
|
||||
'number_of_payments' => 'Aantal betalingen',
|
||||
'number_of_payments_helper' => 'Het aantal keren dat deze betaling zal worden gedaan',
|
||||
@ -5059,6 +5059,8 @@ Email: :email<b><br><b>',
|
||||
'services' => 'Diensten',
|
||||
'shipping' => 'Verzenden',
|
||||
'tax_exempt' => 'Vrijgesteld van belasting',
|
||||
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
@ -4978,7 +4978,7 @@ O envio de E-mails foi suspenso. Será retomado às 23:00 UTC.',
|
||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||
'xinvoice_payable' => 'Pagável dentro de :payeddue dias líquidos até :paydate',
|
||||
'xinvoice_no_buyers_reference' => "Nenhuma referência do comprador fornecida",
|
||||
'xinvoice_online_payment' => 'A fatura deve ser paga online através do link fornecido',
|
||||
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
|
||||
'pre_payment' => 'Pré-Pagamento',
|
||||
'number_of_payments' => 'Número de pagamentos',
|
||||
'number_of_payments_helper' => 'O número de vezes que esse pagamento será feito',
|
||||
@ -5062,6 +5062,8 @@ O envio de E-mails foi suspenso. Será retomado às 23:00 UTC.',
|
||||
'services' => 'Services',
|
||||
'shipping' => 'Shipping',
|
||||
'tax_exempt' => 'Tax Exempt',
|
||||
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
@ -4964,7 +4964,7 @@ Nemôžete nájsť faktúru? Potrebujete poradiť? Radi Vám pomôžeme
|
||||
'payment_type_Interac E Transfer' => 'Interac E Transfer',
|
||||
'xinvoice_payable' => 'Splatné do :payeddue dní netto do :paydate',
|
||||
'xinvoice_no_buyers_reference' => "Nebola uvedená žiadna referencia kupujúceho",
|
||||
'xinvoice_online_payment' => 'Faktúru je potrebné uhradiť online cez uvedený odkaz',
|
||||
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link',
|
||||
'pre_payment' => 'Platba vopred',
|
||||
'number_of_payments' => 'Počet platieb',
|
||||
'number_of_payments_helper' => 'Koľkokrát sa táto platba uskutoční',
|
||||
@ -5048,6 +5048,8 @@ Nemôžete nájsť faktúru? Potrebujete poradiť? Radi Vám pomôžeme
|
||||
'services' => 'Services',
|
||||
'shipping' => 'Shipping',
|
||||
'tax_exempt' => 'Tax Exempt',
|
||||
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date',
|
||||
|
||||
);
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user