diff --git a/app/Console/Commands/SendRemindersCron.php b/app/Console/Commands/SendRemindersCron.php index b7f44231fa75..4ffec48476c1 100644 --- a/app/Console/Commands/SendRemindersCron.php +++ b/app/Console/Commands/SendRemindersCron.php @@ -174,7 +174,7 @@ class SendRemindersCron extends Command $invoice->calc()->getInvoice()->save(); $invoice->fresh(); $invoice->service()->deletePdf()->save(); - if ($invoice->company->enable_e_invoice){ + if ($invoice->client->getSetting('enable_e_invoice')){ $invoice->service()->deleteEInvoice()->save(); } diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index 25f80ee21dd4..473de7064576 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -479,7 +479,10 @@ class CompanySettings extends BaseSettings public $default_expense_payment_type_id = '0'; + public $enable_e_invoice = false; + public static $casts = [ + 'enable_e_invoice' => 'bool', 'default_expense_payment_type_id' => 'string', 'e_invoice_type' => 'string', 'mailgun_endpoint' => 'string', diff --git a/app/Helpers/Bank/Yodlee/Yodlee.php b/app/Helpers/Bank/Yodlee/Yodlee.php index 709acd306c46..01a2c1ddfeb2 100644 --- a/app/Helpers/Bank/Yodlee/Yodlee.php +++ b/app/Helpers/Bank/Yodlee/Yodlee.php @@ -200,7 +200,6 @@ class Yodlee } } - public function getTransactions($params = []) { $token = $this->getAccessToken(); @@ -208,7 +207,6 @@ class Yodlee $response = Http::withHeaders($this->getHeaders(["Authorization" => "Bearer {$token}"]))->get($this->getEndpoint(). "/transactions", $params); if ($response->successful()) { - // return $response->object(); $it = new IncomeTransformer(); return $it->transform($response->object()); } diff --git a/app/Http/Controllers/Bank/YodleeController.php b/app/Http/Controllers/Bank/YodleeController.php index de2f3cc89b5e..8f4c1691afdc 100644 --- a/app/Http/Controllers/Bank/YodleeController.php +++ b/app/Http/Controllers/Bank/YodleeController.php @@ -22,17 +22,11 @@ class YodleeController extends BaseController { public function auth(YodleeAuthRequest $request) { - // create a user at this point - // use the one time token here to pull in the actual user - // store the user_account_id on the accounts table $yodlee = new Yodlee(); $company = $request->getCompany(); - - //ensure user is enterprise!! - if ($company->account->bank_integration_account_id) { $flow = 'edit'; diff --git a/app/Http/Controllers/BankIntegrationController.php b/app/Http/Controllers/BankIntegrationController.php index f7b706e9317a..f011375f1f1b 100644 --- a/app/Http/Controllers/BankIntegrationController.php +++ b/app/Http/Controllers/BankIntegrationController.php @@ -11,24 +11,25 @@ namespace App\Http\Controllers; +use Illuminate\Http\Request; +use App\Models\BankIntegration; +use App\Utils\Traits\MakesHash; +use Illuminate\Http\JsonResponse; +use App\Helpers\Bank\Yodlee\Yodlee; +use Illuminate\Support\Facades\Cache; use App\Factory\BankIntegrationFactory; use App\Filters\BankIntegrationFilters; -use App\Helpers\Bank\Yodlee\Yodlee; -use App\Http\Requests\BankIntegration\AdminBankIntegrationRequest; -use App\Http\Requests\BankIntegration\BulkBankIntegrationRequest; -use App\Http\Requests\BankIntegration\CreateBankIntegrationRequest; -use App\Http\Requests\BankIntegration\DestroyBankIntegrationRequest; -use App\Http\Requests\BankIntegration\EditBankIntegrationRequest; -use App\Http\Requests\BankIntegration\ShowBankIntegrationRequest; -use App\Http\Requests\BankIntegration\StoreBankIntegrationRequest; -use App\Http\Requests\BankIntegration\UpdateBankIntegrationRequest; use App\Jobs\Bank\ProcessBankTransactions; -use App\Models\BankIntegration; use App\Repositories\BankIntegrationRepository; use App\Transformers\BankIntegrationTransformer; -use App\Utils\Traits\MakesHash; -use Illuminate\Http\Request; -use Illuminate\Support\Facades\Cache; +use App\Http\Requests\BankIntegration\BulkBankIntegrationRequest; +use App\Http\Requests\BankIntegration\EditBankIntegrationRequest; +use App\Http\Requests\BankIntegration\ShowBankIntegrationRequest; +use App\Http\Requests\BankIntegration\AdminBankIntegrationRequest; +use App\Http\Requests\BankIntegration\StoreBankIntegrationRequest; +use App\Http\Requests\BankIntegration\CreateBankIntegrationRequest; +use App\Http\Requests\BankIntegration\UpdateBankIntegrationRequest; +use App\Http\Requests\BankIntegration\DestroyBankIntegrationRequest; class BankIntegrationController extends BaseController { @@ -159,7 +160,7 @@ class BankIntegrationController extends BaseController /** * Perform bulk actions on the list view. * - * @return Collection + * @return Response * */ public function bulk(BulkBankIntegrationRequest $request) @@ -168,12 +169,12 @@ class BankIntegrationController extends BaseController $ids = request()->input('ids'); - $bank_integrations = BankIntegration::withTrashed()->whereIn('id', $this->transformKeys($ids)) - ->company() - ->cursor() - ->each(function ($bank_integration, $key) use ($action) { - $this->bank_integration_repo->{$action}($bank_integration); - }); + BankIntegration::withTrashed()->whereIn('id', $this->transformKeys($ids)) + ->company() + ->cursor() + ->each(function ($bank_integration, $key) use ($action) { + $this->bank_integration_repo->{$action}($bank_integration); + }); /* Need to understand which permission are required for the given bulk action ie. view / edit */ @@ -184,7 +185,7 @@ class BankIntegrationController extends BaseController /** * Return the remote list of accounts stored on the third party provider. * - * @return Response + * @return JsonResponse */ public function refreshAccounts(AdminBankIntegrationRequest $request) { @@ -227,7 +228,7 @@ class BankIntegrationController extends BaseController } } - if (Cache::get("throttle_polling:{$account->key}")) { + if (Cache::get("throttle_polling:{$user_account->key}")) { return response()->json(BankIntegration::query()->company(), 200); } @@ -276,7 +277,7 @@ class BankIntegrationController extends BaseController * Return the remote list of accounts stored on the third party provider * and update our local cache. * - * @return Response + * @return JsonResponse * */ public function getTransactions(AdminBankIntegrationRequest $request) diff --git a/app/Jobs/Bank/ProcessBankTransactions.php b/app/Jobs/Bank/ProcessBankTransactions.php index bb49547f4b3c..a055689928ad 100644 --- a/app/Jobs/Bank/ProcessBankTransactions.php +++ b/app/Jobs/Bank/ProcessBankTransactions.php @@ -63,6 +63,8 @@ class ProcessBankTransactions implements ShouldQueue //Loop through everything until we are up to date $this->from_date = $this->from_date ?: '2021-01-01'; + nlog("Processing transactions for account: {$this->bank_integration->account->key}"); + do { try { $this->processTransactions(); diff --git a/app/Jobs/Entity/CreateEntityPdf.php b/app/Jobs/Entity/CreateEntityPdf.php index 6ee8b367f301..85f342cb8a7c 100644 --- a/app/Jobs/Entity/CreateEntityPdf.php +++ b/app/Jobs/Entity/CreateEntityPdf.php @@ -212,7 +212,7 @@ class CreateEntityPdf implements ShouldQueue throw new FilePermissionsFailure($e->getMessage()); } } - if ($this->entity_string == "invoice" && $this->company->enable_e_invoice){ + if ($this->entity_string == "invoice" && $this->client->getSetting('enable_e_invoice')){ (new CreateEInvoice($this->entity, true))->handle(); } $this->invitation = null; diff --git a/app/Jobs/Invoice/ZipInvoices.php b/app/Jobs/Invoice/ZipInvoices.php index 0a70ea3e4d59..17209446b345 100644 --- a/app/Jobs/Invoice/ZipInvoices.php +++ b/app/Jobs/Invoice/ZipInvoices.php @@ -75,7 +75,7 @@ class ZipInvoices implements ShouldQueue $this->invoices->each(function ($invoice) { (new CreateEntityPdf($invoice->invitations()->first()))->handle(); - if ($this->company->enable_e_invoice){ + if ($invoice->client->getSetting('enable_e_invoice')){ (new CreateEInvoice($invoice, false))->handle(); } }); @@ -86,13 +86,13 @@ class ZipInvoices implements ShouldQueue $file = $invoice->service()->getInvoicePdf(); $zip_file_name = basename($file); $zipFile->addFromString($zip_file_name, Storage::get($file)); - } - if($this->company->enable_e_invoice){ - foreach ($this->invoices as $invoice) { + if($invoice->client->getSetting('enable_e_invoice')){ + $xinvoice = $invoice->service()->getEInvoice(); $xinvoice_zip_file_name = basename($xinvoice); $zipFile->addFromString($xinvoice_zip_file_name, Storage::get($xinvoice)); + } } diff --git a/app/Mail/TemplateEmail.php b/app/Mail/TemplateEmail.php index 231f4e027e71..d9b05c204f36 100644 --- a/app/Mail/TemplateEmail.php +++ b/app/Mail/TemplateEmail.php @@ -153,7 +153,7 @@ class TemplateEmail extends Mailable $this->attachData($ubl_string, $this->invitation->invoice->getFileName('xml')); } } - if ($this->invitation && $this->invitation->invoice && $company->enable_e_invoice && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { + if ($this->invitation && $this->invitation->invoice && $this->invitation->invoice->client->getSetting('enable_e_invoice') && $this->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $this->invitation->invoice->service()->getEInvoice($this->invitation->contact); $disk = config('filesystems.default'); $this->attach(Storage::disk($disk)->path($this->invitation->invoice->client->xinvoice_filepath($this->invitation->invoice->invitations->first()) . $this->invitation->invoice->getFileName("xml"))); diff --git a/app/Models/BankIntegration.php b/app/Models/BankIntegration.php index 5205e2467eb2..17ac1eec4891 100644 --- a/app/Models/BankIntegration.php +++ b/app/Models/BankIntegration.php @@ -35,8 +35,8 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property int|null $created_at * @property int|null $updated_at * @property int|null $deleted_at - * @property int $disabled_upstream - * @property int $auto_sync + * @property bool $disabled_upstream + * @property bool $auto_sync * @property-read \App\Models\Account $account * @property-read \App\Models\Company $company * @property-read mixed $hashed_id diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 5670a069570c..2c38e4ba477c 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -40,6 +40,7 @@ use Illuminate\Support\Str; * @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 static \Illuminate\Database\Eloquent\Builder|BankIntegration where() * @method \App\Models\Company company() * @method int companyId() * @method Builder|static exclude($columns) diff --git a/app/Models/Client.php b/app/Models/Client.php index 37b5c76c2aa4..fa7e6f577f0d 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -167,79 +167,12 @@ use Laracasts\Presenter\PresentableTrait; * @method static \Illuminate\Database\Eloquent\Builder|Client whereWebsite($value) * @method static \Illuminate\Database\Eloquent\Builder|Client withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Client withoutTrashed() + * @method static \Illuminate\Database\Eloquent\Builder|Client with() * @property string $payment_balance - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks * @method static \Illuminate\Database\Eloquent\Builder|Client wherePaymentBalance($value) * @property mixed $tax_data - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks * @method static \Illuminate\Database\Eloquent\Builder|Client whereTaxData($value) - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks * @property int $is_tax_exempt - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks * @method static \Illuminate\Database\Eloquent\Builder|Client whereIsTaxExempt($value) * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger @@ -247,6 +180,7 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \Illuminate\Database\Eloquent\Collection $credits * @property-read \Illuminate\Database\Eloquent\Collection $documents * @property-read \Illuminate\Database\Eloquent\Collection $expenses + * @property-read \Illuminate\Database\Eloquent\Collection $group_settings * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens * @property-read \Illuminate\Database\Eloquent\Collection $invoices * @property-read \Illuminate\Database\Eloquent\Collection $ledger @@ -258,130 +192,9 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices * @property-read \Illuminate\Database\Eloquent\Collection $system_logs * @property-read \Illuminate\Database\Eloquent\Collection $tasks - * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks * @property int $has_valid_vat_number - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks - * @method static \Illuminate\Database\Eloquent\Builder|Client whereHasValidVatNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Client whereLeitwegId($value) - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks - * @property string|null $routing_id - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks - * @method static \Illuminate\Database\Eloquent\Builder|Client whereRoutingId($value) - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $contacts - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $expenses - * @property-read \Illuminate\Database\Eloquent\Collection $gateway_tokens - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $ledger - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact - * @property-read \Illuminate\Database\Eloquent\Collection $projects - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_expenses - * @property-read \Illuminate\Database\Eloquent\Collection $recurring_invoices - * @property-read \Illuminate\Database\Eloquent\Collection $system_logs - * @property-read \Illuminate\Database\Eloquent\Collection $tasks * @mixin \Eloquent */ class Client extends BaseModel implements HasLocalePreference diff --git a/app/Models/Company.php b/app/Models/Company.php index e01bb4dfc977..40dd21aef776 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -96,7 +96,6 @@ use Laracasts\Presenter\PresentableTrait; * @property int $stock_notification * @property string|null $matomo_url * @property int|null $matomo_id - * @property bool $enable_e_invoice * @property int $enabled_expense_tax_rates * @property int $invoice_task_project * @property int $report_include_deleted @@ -640,8 +639,7 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \Illuminate\Database\Eloquent\Collection $vendors * @property-read \Illuminate\Database\Eloquent\Collection $webhooks * @property int $tax_all_products - * @property int $enable_e_invoice - * @property string $xinvoice_type + * @property string $e_invoice_type * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read \Illuminate\Database\Eloquent\Collection $all_activities * @property-read \Illuminate\Database\Eloquent\Collection $all_documents diff --git a/app/Models/GroupSetting.php b/app/Models/GroupSetting.php index 8e2c99d6f27b..d5271b962788 100644 --- a/app/Models/GroupSetting.php +++ b/app/Models/GroupSetting.php @@ -55,29 +55,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|GroupSetting withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|GroupSetting withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $clients - * @property-read \Illuminate\Database\Eloquent\Collection $documents * @mixin \Eloquent */ class GroupSetting extends StaticModel diff --git a/app/Models/InvoiceInvitation.php b/app/Models/InvoiceInvitation.php index 43c41d91cf95..c25403e56c69 100644 --- a/app/Models/InvoiceInvitation.php +++ b/app/Models/InvoiceInvitation.php @@ -77,6 +77,7 @@ use Illuminate\Support\Facades\Storage; * @method static \Illuminate\Database\Eloquent\Builder|InvoiceInvitation whereViewedDate($value) * @method static \Illuminate\Database\Eloquent\Builder|InvoiceInvitation withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|InvoiceInvitation withoutTrashed() + * @method static \Illuminate\Database\Eloquent\Builder|InvoiceInvitation where() * @mixin \Eloquent */ class InvoiceInvitation extends BaseModel @@ -166,7 +167,7 @@ class InvoiceInvitation extends BaseModel public function pdf_file_path() { - $storage_path = Storage::url($this->invoice->client->invoice_filepath().$this->invoice->numberFormatter().'.pdf'); + $storage_path = Storage::url($this->invoice->client->invoice_filepath($this).$this->invoice->numberFormatter().'.pdf'); if (! Storage::exists($this->invoice->client->invoice_filepath($this).$this->invoice->numberFormatter().'.pdf')) { event(new InvoiceWasUpdated($this->invoice, $this->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); diff --git a/app/Repositories/BankIntegrationRepository.php b/app/Repositories/BankIntegrationRepository.php index d4d8d543ce12..bd4bfb2b2d99 100644 --- a/app/Repositories/BankIntegrationRepository.php +++ b/app/Repositories/BankIntegrationRepository.php @@ -11,7 +11,9 @@ namespace App\Repositories; +use App\Utils\Ninja; use App\Models\BankIntegration; +use App\Helpers\Bank\Yodlee\Yodlee; /** * Class for bank integration repository. @@ -22,8 +24,46 @@ class BankIntegrationRepository extends BaseRepository { //stub to store $bank_integration->fill($data); + $bank_integration->save(); return $bank_integration->fresh(); } + + /** + * Removes the bank integration from Yodlee + * + * @param BankIntegration $bank_integration + * + * @return BankIntegration $bank_integration + */ + public function delete($bank_integration) :BankIntegration + { + if ($bank_integration->is_deleted) { + return $bank_integration; + } + + if(Ninja::isHosted()) + { + + $account = $bank_integration->account; + + $bank_integration_account_id = $account->bank_integration_account_id; + + $yodlee = new Yodlee($bank_integration_account_id); + + try { + $yodlee->deleteAccount($bank_integration->bank_account_id); + } + catch(\Exception $e){ + + } + + } + + parent::delete($bank_integration); + + return $bank_integration; + } + } diff --git a/app/Repositories/BaseRepository.php b/app/Repositories/BaseRepository.php index 0439fa59d11a..005a117d02ee 100644 --- a/app/Repositories/BaseRepository.php +++ b/app/Repositories/BaseRepository.php @@ -295,7 +295,7 @@ class BaseRepository } if (! $model->design_id) { - $model->design_id = $this->decodePrimaryKey($client->getSetting('invoice_design_id')); + $model->design_id = intval($this->decodePrimaryKey($client->getSetting('invoice_design_id'))); } //links tasks and expenses back to the invoice, but only if we are not in the middle of a transaction. @@ -334,7 +334,7 @@ class BaseRepository if ($model instanceof Quote) { if (! $model->design_id) { - $model->design_id = $this->decodePrimaryKey($client->getSetting('quote_design_id')); + $model->design_id = intval($this->decodePrimaryKey($client->getSetting('quote_design_id'))); } $model = $model->calc()->getQuote(); @@ -348,7 +348,7 @@ class BaseRepository if ($model instanceof RecurringInvoice) { if (! $model->design_id) { - $model->design_id = $this->decodePrimaryKey($client->getSetting('invoice_design_id')); + $model->design_id = intval($this->decodePrimaryKey($client->getSetting('invoice_design_id'))); } $model = $model->calc()->getRecurringInvoice(); diff --git a/app/Repositories/InvoiceRepository.php b/app/Repositories/InvoiceRepository.php index 969d228c28ab..83b6980f1567 100644 --- a/app/Repositories/InvoiceRepository.php +++ b/app/Repositories/InvoiceRepository.php @@ -78,8 +78,8 @@ class InvoiceRepository extends BaseRepository /** * Handles the restoration on a deleted invoice. * - * @param [type] $invoice [description] - * @return [type] [description] + * @param Invoice $invoice + * @return Invoice */ public function restore($invoice) :Invoice { diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index 0e13943b36c0..da018b6cc14f 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -298,7 +298,7 @@ class EmailDefaults $this->email->email_object->entity instanceof Quote || $this->email->email_object->entity instanceof Credit)) { $pdf = ((new CreateRawPdf($this->email->email_object->invitation, $this->email->company->db))->handle()); - if ($this->email->email_object->company->enable_e_invoice && $this->email->email_object->entity instanceof Invoice) { + if ($this->email->email_object->settings->enable_e_invoice && $this->email->email_object->entity instanceof Invoice) { $tempfile = tmpfile(); file_put_contents(stream_get_meta_data($tempfile)['uri'], $pdf); $xinvoice_path = (new CreateEInvoice($this->email->email_object->entity, true, stream_get_meta_data($tempfile)['uri']))->handle(); @@ -320,7 +320,7 @@ class EmailDefaults } } /** E-Invoice xml file */ - if ($this->email->email_object->company->enable_e_invoice && $this->email->email_object->entity instanceof Invoice) { + if ($this->email->email_object->settings->enable_e_invoice && $this->email->email_object->entity instanceof Invoice) { $xinvoice_path = (new GetInvoiceXInvoice($this->email->email_object->entity))->run(); $this->email->email_object->attachments = array_merge($this->email->email_object->attachments, [['file' => base64_encode(file_get_contents($xinvoice_path)), 'name' => explode(".", $this->email->email_object->entity->getFileName('xml'))[0]."-e_invoice.xml"]]); } diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index 2ea0f677f79f..4d13f104d23e 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -450,7 +450,7 @@ class InvoiceService $this->invoice->invitations->each(function ($invitation) { (new CreateEntityPdf($invitation))->handle(); - if ($invitation->company->enable_e_invoice && $invitation instanceof InvoiceInvitation) + if ($invitation->invoice->client->getSetting('enable_e_invoice') && $invitation instanceof InvoiceInvitation) { (new CreateEInvoice($invitation->invoice, true))->handle(); } @@ -464,7 +464,7 @@ class InvoiceService $this->invoice->invitations->each(function ($invitation) { CreateEntityPdf::dispatch($invitation); - if ($invitation->company->enable_e_invoice && $invitation instanceof InvoiceInvitation) { + if ($invitation->invoice->client->getSetting('enable_e_invoice') && $invitation instanceof InvoiceInvitation) { CreateEInvoice::dispatch($invitation->invoice, true); } diff --git a/app/Transformers/ClientTransformer.php b/app/Transformers/ClientTransformer.php index 512fd9a15a4e..f1d031022c53 100644 --- a/app/Transformers/ClientTransformer.php +++ b/app/Transformers/ClientTransformer.php @@ -149,7 +149,8 @@ class ClientTransformer extends EntityTransformer 'number' => (string) $client->number ?: '', 'has_valid_vat_number' => (bool) $client->has_valid_vat_number, 'is_tax_exempt' => (bool) $client->is_tax_exempt, - // 'tax_data' => $client->tax_data ?: '', + 'routing_id' => (string) $client->routing_id, + 'tax_data' => $client->tax_data ?: '', ]; } } diff --git a/app/Transformers/CompanyTransformer.php b/app/Transformers/CompanyTransformer.php index e52ad26b5cfe..37c1e8011a48 100644 --- a/app/Transformers/CompanyTransformer.php +++ b/app/Transformers/CompanyTransformer.php @@ -196,7 +196,6 @@ class CompanyTransformer extends EntityTransformer 'invoice_task_hours' => (bool) $company->invoice_task_hours, 'calculate_taxes' => (bool) $company->calculate_taxes, 'tax_data' => $company->tax_data ?: new \stdClass, - 'enable_e_invoice' => (bool) $company->enable_e_invoice, ]; } diff --git a/app/Transformers/InvoiceTransformer.php b/app/Transformers/InvoiceTransformer.php index b76d3d6cfddb..5e3b0a93955d 100644 --- a/app/Transformers/InvoiceTransformer.php +++ b/app/Transformers/InvoiceTransformer.php @@ -149,7 +149,7 @@ class InvoiceTransformer extends EntityTransformer 'paid_to_date' => (float) $invoice->paid_to_date, 'subscription_id' => $this->encodePrimaryKey($invoice->subscription_id), 'auto_bill_enabled' => (bool) $invoice->auto_bill_enabled, - // 'tax_data' => $invoice->tax_data ?: '', + 'tax_data' => $invoice->tax_data ?: '', ]; } } diff --git a/app/Utils/Ninja.php b/app/Utils/Ninja.php index 7d264753a91b..a858276eda0f 100644 --- a/app/Utils/Ninja.php +++ b/app/Utils/Ninja.php @@ -44,12 +44,14 @@ class Ninja { $mysql_version = DB::select(DB::raw('select version() as version'))[0]->version; + $version = request()->input('version', 'No Version Supplied.'); + $info = 'App Version: v'.config('ninja.app_version').'\\n'. 'White Label: '.'\\n'. // TODO: Implement white label with hasFeature. 'Server OS: '.php_uname('s').' '.php_uname('r').'\\n'. 'PHP Version: '.phpversion().'\\n'. 'MySQL Version: '.$mysql_version.'\\n'. - 'Version: '.request()->has('version') ? request()->input('version') : 'No Version Supplied.'; + 'Version: '.$version; return $info; } @@ -101,7 +103,8 @@ class Ninja foreach ($fields as $key => $value) { $data .= $key.'='.$value.'&'; } - rtrim($data, '&'); + + $data = rtrim($data, '&'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); diff --git a/database/migrations/2023_04_27_045639_add_kmher_language.php b/database/migrations/2023_04_27_045639_add_kmher_language.php index bc841b67eb2d..2da0ccdbe12f 100644 --- a/database/migrations/2023_04_27_045639_add_kmher_language.php +++ b/database/migrations/2023_04_27_045639_add_kmher_language.php @@ -1,6 +1,7 @@ 38, 'name' => 'Khmer', 'locale' => 'km_KH']); } + Schema::table('companies', function (Blueprint $table) { + $table->dropColumn('enable_e_invoice'); + }); }