diff --git a/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php b/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php index a85307e357..2d2c8c129b 100644 --- a/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php +++ b/app/Http/Requests/TaskScheduler/StoreSchedulerRequest.php @@ -96,7 +96,7 @@ class StoreSchedulerRequest extends Request 'parameters.auto_send' => ['bail','sometimes', 'boolean', 'required_if:template,invoice_outstanding_tasks'], 'parameters.invoice_id' => ['bail', 'string', 'required_if:template,payment_schedule', new InvoiceWithNoExistingSchedule()], 'parameters.auto_bill' => ['bail', 'boolean', 'required_if:template,payment_schedule'], - 'parameters.template' => ['bail', 'sometimes', 'string', Rule::in($this->templates)], + 'parameters.template' => ['bail', 'sometimes', 'nullable', 'string', Rule::in($this->templates)], 'parameters.schedule' => ['bail', 'array', 'required_if:template,payment_schedule', 'min:1'], 'parameters.schedule.*.id' => ['bail','sometimes', 'integer'], 'parameters.schedule.*.date' => ['bail','sometimes', 'date:Y-m-d'], diff --git a/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php b/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php index 0aebdb91ae..3bf5f7e652 100644 --- a/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php +++ b/app/Http/Requests/TaskScheduler/UpdateSchedulerRequest.php @@ -93,7 +93,7 @@ class UpdateSchedulerRequest extends Request 'parameters.auto_send' => ['bail','sometimes', 'boolean', 'required_if:template,invoice_outstanding_tasks'], // 'parameters.invoice_id' => ['bail','sometimes', 'string', 'required_if:template,payment_schedule'], 'parameters.auto_bill' => ['bail','sometimes', 'boolean', 'required_if:template,payment_schedule'], - 'parameters.template' => ['bail', 'sometimes', 'string', Rule::in($this->templates)], + 'parameters.template' => ['bail', 'sometimes', 'nullable', 'string', Rule::in($this->templates)], 'parameters.schedule' => ['bail', 'array', 'required_if:template,payment_schedule','min:1'], 'parameters.schedule.*.id' => ['bail','sometimes', 'integer'], diff --git a/routes/api.php b/routes/api.php index 7b6c1557bc..d1ae45339c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -11,6 +11,7 @@ | */ use Illuminate\Support\Facades\Route; +use App\Http\Controllers\SNSController; use App\Http\Controllers\BaseController; use App\Http\Controllers\PingController; use App\Http\Controllers\SmtpController; @@ -49,6 +50,7 @@ use App\Http\Controllers\WebhookController; use App\Http\Controllers\ActivityController; use App\Http\Controllers\DocumentController; use App\Http\Controllers\EInvoiceController; +use App\Http\Controllers\FeedbackController; use App\Http\Controllers\LocationController; use App\Http\Controllers\PostMarkController; use App\Http\Controllers\TemplateController; @@ -116,6 +118,7 @@ use App\Http\Controllers\Reports\ARDetailReportController; use App\Http\Controllers\Reports\DocumentReportController; use App\Http\Controllers\Reports\ARSummaryReportController; use App\Http\Controllers\Reports\QuoteItemReportController; +use App\Http\Controllers\Reports\TaxPeriodReportController; use App\Http\Controllers\Reports\UserSalesReportController; use App\Http\Controllers\Reports\TaxSummaryReportController; use App\Http\Controllers\Support\Messages\SendingController; @@ -189,6 +192,7 @@ Route::group(['middleware' => ['throttle:api', 'token_auth', 'valid_json','local Route::post('reactivate_email/{bounce_id}', [ClientController::class, 'reactivateEmail'])->name('clients.reactivate_email'); + Route::post('feedback', FeedbackController::class)->name('feedback'); Route::post('filters/{entity}', [FilterController::class, 'index'])->name('filters'); Route::resource('client_gateway_tokens', ClientGatewayTokenController::class); @@ -238,7 +242,7 @@ Route::group(['middleware' => ['throttle:api', 'token_auth', 'valid_json','local Route::post('einvoice/validateEntity', [EInvoiceController::class, 'validateEntity'])->name('einvoice.validateEntity'); Route::post('einvoice/configurations', [EInvoiceController::class, 'configurations'])->name('einvoice.configurations'); - + Route::post('einvoice/peppol/legal_entity', [EInvoicePeppolController::class, 'show'])->name('einvoice.peppol.legal_entity'); Route::post('einvoice/peppol/setup', [EInvoicePeppolController::class, 'setup'])->name('einvoice.peppol.setup'); Route::post('einvoice/peppol/disconnect', [EInvoicePeppolController::class, 'disconnect'])->name('einvoice.peppol.disconnect'); @@ -271,11 +275,13 @@ Route::group(['middleware' => ['throttle:api', 'token_auth', 'valid_json','local Route::post('import', [ImportController::class, 'import'])->name('import.import'); Route::post('import_json', [ImportJsonController::class, 'import'])->name('import.import_json'); Route::post('preimport', [ImportController::class, 'preimport'])->name('import.preimport'); - + Route::resource('invoices', InvoiceController::class); // name = (invoices. index / create / show / update / destroy / edit Route::get('invoices/{invoice}/delivery_note', [InvoiceController::class, 'deliveryNote'])->name('invoices.delivery_note'); Route::get('invoices/{invoice}/{action}', [InvoiceController::class, 'action'])->name('invoices.action'); Route::put('invoices/{invoice}/upload', [InvoiceController::class, 'upload'])->name('invoices.upload'); + Route::post('invoices/{invoice}/payment_schedule', [InvoiceController::class, 'paymentSchedule'])->name('invoices.payment_schedule'); + Route::delete('invoices/{invoice}/payment_schedule', [InvoiceController::class, 'deletePaymentSchedule'])->name('invoices.delete_payment_schedule'); Route::get('invoice/{invitation_key}/download', [InvoiceController::class, 'downloadPdf'])->name('invoices.downloadPdf'); Route::get('invoice/{invitation_key}/download_e_invoice', [InvoiceController::class, 'downloadEInvoice'])->name('invoices.downloadEInvoice'); Route::post('invoices/bulk', [InvoiceController::class, 'bulk'])->name('invoices.bulk'); @@ -316,7 +322,7 @@ Route::group(['middleware' => ['throttle:api', 'token_auth', 'valid_json','local Route::resource('projects', ProjectController::class); // name = (projects. index / create / show / update / destroy / edit Route::post('projects/bulk', [ProjectController::class, 'bulk'])->name('projects.bulk'); Route::put('projects/{project}/upload', [ProjectController::class, 'upload'])->name('projects.upload'); - + Route::resource('purchase_orders', PurchaseOrderController::class); Route::post('purchase_orders/bulk', [PurchaseOrderController::class, 'bulk'])->name('purchase_orders.bulk'); Route::put('purchase_orders/{purchase_order}/upload', [PurchaseOrderController::class, 'upload']); @@ -370,6 +376,7 @@ Route::group(['middleware' => ['throttle:api', 'token_auth', 'valid_json','local Route::post('reports/client_balance_report', ClientBalanceReportController::class); Route::post('reports/client_sales_report', ClientSalesReportController::class); Route::post('reports/tax_summary_report', TaxSummaryReportController::class); + Route::post('reports/tax_period_report', TaxPeriodReportController::class); Route::post('reports/user_sales_report', UserSalesReportController::class); Route::post('reports/projects', ProjectReportController::class); Route::post('reports/preview/{hash}', ReportPreviewController::class); @@ -410,7 +417,7 @@ Route::group(['middleware' => ['throttle:api', 'token_auth', 'valid_json','local Route::post('settings/disable_two_factor', [TwoFactorController::class, 'disableTwoFactor']); Route::post('verify', [TwilioController::class, 'generate'])->name('verify.generate')->middleware('throttle:daily-verify'); - Route::post('verify/confirm', [TwilioController::class, 'confirm'])->name('verify.confirm'); + Route::post('verify/confirm', [TwilioController::class, 'confirm'])->name('verify.confirm')->middleware('throttle:daily-verify'); Route::resource('vendors', VendorController::class); // name = (vendors. index / create / show / update / destroy / edit Route::post('vendors/bulk', [VendorController::class, 'bulk'])->name('vendors.bulk'); @@ -463,7 +470,7 @@ Route::group(['middleware' => ['throttle:api', 'token_auth', 'valid_json','local }); Route::post('api/v1/sms_reset', [TwilioController::class, 'generate2faResetCode'])->name('sms_reset.generate')->middleware('throttle:daily-verify'); -Route::post('api/v1/sms_reset/confirm', [TwilioController::class, 'confirm2faResetCode'])->name('sms_reset.confirm')->middleware('throttle:3,1'); +Route::post('api/v1/sms_reset/confirm', [TwilioController::class, 'confirm2faResetCode'])->name('sms_reset.confirm')->middleware('throttle:daily-verify'); Route::match(['get', 'post'], 'payment_webhook/{company_key}/{company_gateway_id}', PaymentWebhookController::class) ->middleware('throttle:1000,1') @@ -474,6 +481,7 @@ Route::match(['get', 'post'], 'payment_notification_webhook/{company_key}/{compa ->name('payment_notification_webhook'); Route::post('api/v1/postmark_webhook', [PostMarkController::class, 'webhook'])->middleware('throttle:5000,1'); +Route::post('api/v1/sns_webhook', [SNSController::class, 'webhook'])->middleware('throttle:5000,1'); Route::post('api/v1/postmark_inbound_webhook', [PostMarkController::class, 'inboundWebhook'])->middleware('throttle:1000,1'); Route::post('api/v1/mailgun_webhook', [MailgunController::class, 'webhook'])->middleware('throttle:1000,1'); Route::post('api/v1/mailgun_inbound_webhook', [MailgunController::class, 'inboundWebhook'])->middleware('throttle:1000,1'); @@ -507,4 +515,4 @@ Route::get('/health', function () { 'status' => 'ok', 'message' => 'API is healthy', ]); -})->middleware('throttle:20,1'); +})->middleware('throttle:20,1'); \ No newline at end of file diff --git a/tests/Feature/Scheduler/SchedulerTest.php b/tests/Feature/Scheduler/SchedulerTest.php index c35036234a..83494c9c6e 100644 --- a/tests/Feature/Scheduler/SchedulerTest.php +++ b/tests/Feature/Scheduler/SchedulerTest.php @@ -416,23 +416,19 @@ class SchedulerTest extends TestCase ], ]; - - + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/task_schedulers', $data); - -$response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, -])->postJson('/api/v1/task_schedulers', $data); - - $response->assertStatus(200); + $response->assertStatus(200); -$response = $this->withHeaders([ - 'X-API-SECRET' => config('ninja.api_secret'), - 'X-API-TOKEN' => $this->token, -])->postJson('/api/v1/task_schedulers', $data); + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/task_schedulers', $data); $response->assertStatus(422);