| @@ -6,17 +6,20 @@ | ||
| 6 | 6 | */ |
| 7 | 7 | |
| 8 | 8 | use FluentCart\App\Http\Controllers\AddonsController; |
| 9 | 9 | use FluentCart\App\Http\Controllers\AddressInfoController; |
| 10 | +use FluentCart\App\Http\Controllers\AttributesController; | |
| 10 | 11 | use FluentCart\App\Http\Controllers\AppControllers\AppController; |
| 11 | -use FluentCart\App\Http\Controllers\AttributesController; | |
| 12 | 12 | use FluentCart\App\Http\Controllers\CheckoutFieldsController; |
| 13 | 13 | use FluentCart\App\Http\Controllers\CustomerController; |
| 14 | 14 | use FluentCart\App\Http\Controllers\DashboardController; |
| 15 | +use FluentCart\App\Http\Controllers\DataBackfillController; | |
| 15 | 16 | use FluentCart\App\Http\Controllers\EmailNotificationController; |
| 16 | 17 | use FluentCart\App\Http\Controllers\FileUploadController; |
| 17 | 18 | use FluentCart\App\Http\Controllers\IntegrationController; |
| 19 | +use FluentCart\App\Http\Controllers\RenewalController; | |
| 18 | 20 | use FluentCart\App\Http\Controllers\LabelController; |
| 21 | +use FluentCart\App\Http\Controllers\McpSettingsController; | |
| 19 | 22 | use FluentCart\App\Http\Controllers\ModuleSettingsController; |
| 20 | 23 | use FluentCart\App\Http\Controllers\NotesController; |
| 21 | 24 | use FluentCart\App\Http\Controllers\OnboardingController; |
| 22 | 25 | use FluentCart\App\Http\Controllers\OrderController; |
| @@ -26,9 +29,8 @@ | ||
| 26 | 29 | use FluentCart\App\Http\Controllers\ProductVariationController; |
| 27 | 30 | use FluentCart\App\Http\Controllers\StorageController; |
| 28 | 31 | use FluentCart\App\Http\Controllers\SettingsController; |
| 29 | 32 | use FluentCart\App\Http\Controllers\CouponsController; |
| 30 | -use FluentCart\App\Http\Controllers\TaxClassController; | |
| 31 | 33 | use FluentCart\App\Http\Controllers\TaxConfigurationController; |
| 32 | 34 | use FluentCart\App\Http\Controllers\TaxRateController; |
| 33 | 35 | use FluentCart\App\Http\Controllers\TemplateController; |
| 34 | 36 | use FluentCart\App\Http\Controllers\VariantController; |
| @@ -49,8 +51,12 @@ | ||
| 49 | 51 | $router->prefix('dashboard')->withPolicy('AdminPolicy')->group(function (Router $router) { |
| 50 | 52 | $router->get('/', [DashboardController::class, 'getOnboardingData']); |
| 51 | 53 | }); |
| 52 | 54 | |
| 55 | +$router->prefix('data-backfills')->withPolicy('AdminPolicy')->group(function (Router $router) { | |
| 56 | + $router->post('/run', [DataBackfillController::class, 'run']); | |
| 57 | +}); | |
| 58 | + | |
| 53 | 59 | $router->prefix('dashboard')->withPolicy('DashboardPolicy')->group(function (Router $router) { |
| 54 | 60 | $router->get('/stats', [DashboardController::class, 'getDashboardStats'])->meta([ |
| 55 | 61 | 'permissions' => 'dashboard_stats/view' |
| 56 | 62 | ]); |
| @@ -165,8 +171,11 @@ | ||
| 165 | 171 | ]); |
| 166 | 172 | $router->post('/{postId}/tax-class/remove', [ProductController::class, 'removeTaxClass'])->meta([ |
| 167 | 173 | 'permissions' => 'products/edit' |
| 168 | 174 | ]); |
| 175 | + $router->post('/{postId}/tax-exempt', [ProductController::class, 'toggleTaxExempt'])->meta([ | |
| 176 | + 'permissions' => 'products/edit' | |
| 177 | + ]); | |
| 169 | 178 | |
| 170 | 179 | $router->post('/{postId}/shipping-class', [ProductController::class, 'updateShippingClass'])->meta([ |
| 171 | 180 | 'permissions' => 'products/edit' |
| 172 | 181 | ]); |
| @@ -232,11 +241,27 @@ | ||
| 232 | 241 | $router->post('/variants', [ProductVariationController::class, 'create'])->meta([ |
| 233 | 242 | 'permissions' => 'products/create' |
| 234 | 243 | ]); |
| 235 | 244 | |
| 245 | + // Advanced Variation — bulk price/stock/status edit for variant combinations. | |
| 246 | + // Registered BEFORE the /variants/{variantId} routes so the first-match | |
| 247 | + // router doesn't capture 'bulk-update' as a {variantId}. | |
| 248 | + $router->post('/variants/bulk-update', [ProductVariationController::class, 'bulkUpdate'])->meta([ | |
| 249 | + 'permissions' => 'products/edit' | |
| 250 | + ]); | |
| 251 | + | |
| 252 | + // Group bulk update — PATCH semantics: only non-null fields are written. | |
| 253 | + // Registered BEFORE /variants/{variantId} to avoid the param capturing 'group-bulk-update'. | |
| 254 | + $router->post('/variants/group-bulk-update', [ProductVariationController::class, 'groupBulkUpdate'])->meta([ | |
| 255 | + 'permissions' => 'products/edit' | |
| 256 | + ]); | |
| 257 | + | |
| 236 | 258 | $router->post('/variants/{variantId}', [ProductVariationController::class, 'update'])->meta([ |
| 237 | 259 | 'permissions' => 'products/edit' |
| 238 | 260 | ]); |
| 261 | + $router->post('/variants/{variantId}/tax-exempt', [ProductVariationController::class, 'updateTaxSettings'])->meta([ | |
| 262 | + 'permissions' => 'products/edit' | |
| 263 | + ]); | |
| 239 | 264 | |
| 240 | 265 | $router->delete('/variants/{variantId}', [ProductVariationController::class, 'delete'])->meta([ |
| 241 | 266 | 'permissions' => 'products/delete' |
| 242 | 267 | ]); |
| @@ -255,8 +280,54 @@ | ||
| 255 | 280 | $router->get('/', [VariantController::class, 'index'])->meta([ |
| 256 | 281 | 'permissions' => 'products/view' |
| 257 | 282 | ]); |
| 258 | 283 | }); |
| 284 | + | |
| 285 | +// Advanced Variation — attribute library (groups + terms) | |
| 286 | +$router->prefix('options')->withPolicy('ProductPolicy')->group(function (Router $router) { | |
| 287 | + // Library endpoint — single payload powering the Advanced Variation library | |
| 288 | + // picker (full group list with terms + the frequently-used IDs for chips). | |
| 289 | + // Registered BEFORE 'attr/groups' to ensure the more-specific path wins. | |
| 290 | + $router->get('attr/groups/library', [AttributesController::class, 'getLibrary'])->meta([ | |
| 291 | + 'permissions' => 'products/view' | |
| 292 | + ]); | |
| 293 | + $router->get('attr/groups', [AttributesController::class, 'getGroups'])->meta([ | |
| 294 | + 'permissions' => 'products/view' | |
| 295 | + ]); | |
| 296 | + // Plural 'attr/groups/reorder' doesn't collide with the singular | |
| 297 | + // 'attr/group/{group_id}' routes below; kept here next to its list sibling. | |
| 298 | + $router->post('attr/groups/reorder', [AttributesController::class, 'reorderGroups'])->meta([ | |
| 299 | + 'permissions' => 'products/edit' | |
| 300 | + ]); | |
| 301 | + $router->post('attr/group/', [AttributesController::class, 'createGroup'])->meta([ | |
| 302 | + 'permissions' => 'products/create' | |
| 303 | + ]); | |
| 304 | + $router->get('attr/group/{group_id}', [AttributesController::class, 'getGroup'])->meta([ | |
| 305 | + 'permissions' => 'products/view' | |
| 306 | + ]); | |
| 307 | + $router->put('attr/group/{group_id}', [AttributesController::class, 'updateGroup'])->meta([ | |
| 308 | + 'permissions' => 'products/edit' | |
| 309 | + ]); | |
| 310 | + $router->delete('attr/group/{group_id}', [AttributesController::class, 'deleteGroup'])->meta([ | |
| 311 | + 'permissions' => 'products/delete' | |
| 312 | + ]); | |
| 313 | + $router->get('attr/group/{group_id}/terms', [AttributesController::class, 'getTerms'])->meta([ | |
| 314 | + 'permissions' => 'products/view' | |
| 315 | + ]); | |
| 316 | + $router->post('attr/group/{group_id}/terms', [AttributesController::class, 'createTerms'])->meta([ | |
| 317 | + 'permissions' => 'products/create' | |
| 318 | + ]); | |
| 319 | + $router->post('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'updateTerm'])->meta([ | |
| 320 | + 'permissions' => 'products/edit' | |
| 321 | + ]); | |
| 322 | + $router->delete('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'deleteTerm'])->meta([ | |
| 323 | + 'permissions' => 'products/delete' | |
| 324 | + ]); | |
| 325 | + $router->post('attr/group/{group_id}/terms/reorder', [AttributesController::class, 'reorderTerms'])->meta([ | |
| 326 | + 'permissions' => 'products/edit' | |
| 327 | + ]); | |
| 328 | +}); | |
| 329 | + | |
| 259 | 330 | //Integration route declaration |
| 260 | 331 | $router->prefix('integration')->withPolicy('IntegrationPolicy')->group(function (Router $router) { |
| 261 | 332 | |
| 262 | 333 | $router->get('addons', [AddonsController::class, 'getAddons'])->meta([ |
| @@ -406,9 +477,23 @@ | ||
| 406 | 477 | $router->post('modules', [ModuleSettingsController::class, 'saveSettings'])->meta([ |
| 407 | 478 | 'permissions' => 'is_super_admin' |
| 408 | 479 | ]); |
| 409 | 480 | |
| 481 | + // MCP (Features & addon → MCP card): status, on/off toggle, connection snippet. | |
| 482 | + $router->get('mcp', [McpSettingsController::class, 'status'])->meta([ | |
| 483 | + 'permissions' => 'is_super_admin' | |
| 484 | + ]); | |
| 485 | + $router->post('mcp/toggle', [McpSettingsController::class, 'toggle'])->meta([ | |
| 486 | + 'permissions' => 'is_super_admin' | |
| 487 | + ]); | |
| 488 | + $router->post('mcp/install-adapter', [McpSettingsController::class, 'installAdapter'])->meta([ | |
| 489 | + 'permissions' => 'is_super_admin' | |
| 490 | + ]); | |
| 491 | + $router->get('mcp/config-snippets', [McpSettingsController::class, 'getConfigSnippets'])->meta([ | |
| 492 | + 'permissions' => 'is_super_admin' | |
| 493 | + ]); | |
| 410 | 494 | |
| 495 | + | |
| 411 | 496 | $router->post('confirmation', [SettingsController::class, 'saveConfirmation'])->meta([ |
| 412 | 497 | 'permissions' => 'is_super_admin' |
| 413 | 498 | ]); |
| 414 | 499 | //shortcode get |
| @@ -431,8 +516,20 @@ | ||
| 431 | 516 | ]); |
| 432 | 517 | $router->post('storage-drivers/verify-info', [StorageController::class, 'verifyConnectInfo'])->meta([ |
| 433 | 518 | 'permissions' => 'is_super_admin' |
| 434 | 519 | ]); |
| 520 | + $router->post('storage-drivers/create-bucket', [StorageController::class, 'createBucket'])->meta([ | |
| 521 | + 'permissions' => 'is_super_admin' | |
| 522 | + ]); | |
| 523 | + $router->post('storage-drivers/bucket-list', [StorageController::class, 'listBuckets'])->meta([ | |
| 524 | + 'permissions' => 'is_super_admin' | |
| 525 | + ]); | |
| 526 | + $router->post('storage-drivers/reset', [StorageController::class, 'resetSettings'])->meta([ | |
| 527 | + 'permissions' => 'is_super_admin' | |
| 528 | + ]); | |
| 529 | + $router->post('storage-drivers/change-status', [StorageController::class, 'changeStatus'])->meta([ | |
| 530 | + 'permissions' => 'is_super_admin' | |
| 531 | + ]); | |
| 435 | 532 | |
| 436 | 533 | |
| 437 | 534 | }); |
| 438 | 535 | |
| @@ -444,14 +541,21 @@ | ||
| 444 | 541 | $router->post('/calculate-shipping', [OrderController::class, 'updateShipping'])->meta([ |
| 445 | 542 | 'permissions' => ['orders/create', 'orders/manage'] |
| 446 | 543 | ]); |
| 447 | 544 | |
| 545 | + // Public utility: pure tax calculation, no DB writes. No longer called by the admin Vue | |
| 546 | + // (tax is now auto-applied server-side on save). Available for third-party integrations. | |
| 547 | + $router->post('/calculate-tax', [OrderController::class, 'calculateTax'])->meta([ | |
| 548 | + 'permissions' => ['orders/create', 'orders/manage'], | |
| 549 | + 'permissions_type' => 'any', | |
| 550 | + ]); | |
| 551 | + | |
| 448 | 552 | $router->post('/', [OrderController::class, 'store'])->meta([ |
| 449 | 553 | 'permissions' => 'orders/create' |
| 450 | 554 | ]); |
| 451 | 555 | |
| 452 | 556 | $router->post('/do-bulk-action', [OrderController::class, 'handleBulkActions'])->meta([ |
| 453 | - 'permissions' => 'orders/manage' | |
| 557 | + 'permissions' => 'orders/delete' // every accepted action deletes orders — same gate as DELETE /{order_id} | |
| 454 | 558 | ]); |
| 455 | 559 | |
| 456 | 560 | $router->post('/{order}/mark-as-paid', [OrderController::class, 'markAsPaid'])->meta([ |
| 457 | 561 | 'permissions' => 'orders/manage' |
| @@ -506,11 +610,13 @@ | ||
| 506 | 610 | $router->post('/{order}/transactions/{transaction_id}/accept-dispute/', [OrderController::class, 'acceptDispute'])->meta([ |
| 507 | 611 | 'permissions' => 'orders/manage' |
| 508 | 612 | ]); |
| 509 | 613 | |
| 510 | - $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getDetails'])->meta([ | |
| 511 | - 'permissions' => 'orders/view' | |
| 512 | - ]); | |
| 614 | + $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getTransactionDetails']) | |
| 615 | + ->int('id', 'transaction_id') | |
| 616 | + ->meta([ | |
| 617 | + 'permissions' => 'orders/view' | |
| 618 | + ]); | |
| 513 | 619 | |
| 514 | 620 | $router->put('/{order}/address/{id}', [OrderController::class, 'updateOrderAddress'])->meta([ |
| 515 | 621 | 'permissions' => 'orders/manage' |
| 516 | 622 | ]); |
| @@ -518,8 +624,12 @@ | ||
| 518 | 624 | $router->put('/{order}/transactions/{transaction}/status', [OrderController::class, 'updateTransactionStatus'])->meta([ |
| 519 | 625 | 'permissions' => 'orders/manage' |
| 520 | 626 | ]); |
| 521 | 627 | |
| 628 | + $router->post('/{order}/transactions/{transaction}/sync', [OrderController::class, 'syncPendingTransaction'])->meta([ | |
| 629 | + 'permissions' => 'orders/manage' | |
| 630 | + ]); | |
| 631 | + | |
| 522 | 632 | $router->post('/{order}/create-custom', [OrderController::class, 'createCustom'])->int('id')->meta([ |
| 523 | 633 | 'permissions' => 'orders/create' |
| 524 | 634 | ]); |
| 525 | 635 | |
| @@ -532,9 +642,26 @@ | ||
| 532 | 642 | ]); |
| 533 | 643 | |
| 534 | 644 | }); |
| 535 | 645 | |
| 646 | +$router->prefix('renewals')->withPolicy('OrderPolicy')->group(function (Router $router) { | |
| 647 | + $router->get('/', [RenewalController::class, 'index'])->meta([ | |
| 648 | + 'permissions' => 'orders/view' | |
| 649 | + ]); | |
| 536 | 650 | |
| 651 | + $router->get('/{id}', [RenewalController::class, 'show'])->int('id')->meta([ | |
| 652 | + 'permissions' => 'orders/view' | |
| 653 | + ]); | |
| 654 | + | |
| 655 | + $router->post('/{order}/void', [RenewalController::class, 'void'])->meta([ | |
| 656 | + 'permissions' => 'orders/manage' | |
| 657 | + ]); | |
| 658 | + | |
| 659 | + $router->post('/{order}/resend', [RenewalController::class, 'resend'])->meta([ | |
| 660 | + 'permissions' => 'orders/manage' | |
| 661 | + ]); | |
| 662 | +}); | |
| 663 | + | |
| 537 | 664 | $router->prefix('labels')->withPolicy('LabelPolicy')->group(function (Router $router) { |
| 538 | 665 | $router->get('/', [LabelController::class, 'index'])->meta([ |
| 539 | 666 | 'permissions' => 'labels/view' |
| 540 | 667 | ]); |
| @@ -621,56 +748,15 @@ | ||
| 621 | 748 | |
| 622 | 749 | }); |
| 623 | 750 | |
| 624 | 751 | |
| 625 | -$router->prefix('options')->withPolicy('ProductPolicy')->group(function (Router $router) { | |
| 626 | - $router->get('attr/groups', [AttributesController::class, 'getGroups'])->meta([ | |
| 627 | - 'permissions' => 'products/view' | |
| 628 | - ]); | |
| 629 | 752 | |
| 630 | - $router->post('attr/group/', [AttributesController::class, 'createGroup'])->meta([ | |
| 631 | - 'permissions' => 'products/create' | |
| 632 | - ]); | |
| 633 | - | |
| 634 | - $router->get('attr/group/{group_id}', [AttributesController::class, 'getGroup'])->meta([ | |
| 635 | - 'permissions' => 'products/view' | |
| 636 | - ]); | |
| 637 | - | |
| 638 | - $router->put('attr/group/{group_id}', [AttributesController::class, 'updateGroup'])->meta([ | |
| 639 | - 'permissions' => 'products/edit' | |
| 640 | - ]); | |
| 641 | - | |
| 642 | - $router->delete('attr/group/{group_id}', [AttributesController::class, 'deleteGroup'])->meta([ | |
| 643 | - 'permissions' => 'products/delete' | |
| 644 | - ]); | |
| 645 | - | |
| 646 | - $router->get('attr/group/{group_id}/terms', [AttributesController::class, 'getTerms'])->meta([ | |
| 647 | - 'permissions' => 'products/view' | |
| 648 | - ]); | |
| 649 | - | |
| 650 | - $router->post('attr/group/{group_id}/term', [AttributesController::class, 'createTerm'])->meta([ | |
| 651 | - 'permissions' => 'products/create' | |
| 652 | - ]); | |
| 653 | - | |
| 654 | - $router->post('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'updateTerm'])->meta([ | |
| 655 | - 'permissions' => 'products/edit' | |
| 656 | - ]); | |
| 657 | - | |
| 658 | - $router->delete('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'deleteTerm'])->meta([ | |
| 659 | - 'permissions' => 'products/delete' | |
| 660 | - ]); | |
| 661 | - | |
| 662 | - $router->post('attr/group/{group_id}/term/{term_id}/serial', [AttributesController::class, 'changeTermSerial'])->meta([ | |
| 663 | - 'permissions' => 'products/edit' | |
| 664 | - ]); | |
| 665 | -}); | |
| 666 | - | |
| 667 | - | |
| 668 | 753 | $router->prefix('onboarding')->withPolicy('AdminPolicy')->group(function (Router $router) { |
| 669 | 754 | $router->get('/', [OnboardingController::class, 'index']); |
| 670 | 755 | $router->post('/', [OnboardingController::class, 'saveSettings']); |
| 671 | 756 | $router->post('/create-pages', [OnboardingController::class, 'createPages']); |
| 672 | 757 | $router->post('/create-page', [OnboardingController::class, 'createPage']); |
| 758 | + $router->post('/save-tax', [OnboardingController::class, 'saveTaxSettings']); | |
| 673 | 759 | }); |
| 674 | 760 | $router->prefix('email-notification')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) { |
| 675 | 761 | $router->get('/', [EmailNotificationController::class, 'index']); |
| 676 | 762 | $router->get('/get-short-codes', [EmailNotificationController::class, 'getShortCodes']); |
| @@ -677,8 +763,11 @@ | ||
| 677 | 763 | $router->get('/get-settings', [EmailNotificationController::class, 'getSettings']); |
| 678 | 764 | $router->post('/save-settings', [EmailNotificationController::class, 'saveSettings']); |
| 679 | 765 | $router->get('/reminders', [EmailNotificationController::class, 'getSchedulingSettings']); |
| 680 | 766 | $router->post('/reminders', [EmailNotificationController::class, 'saveSchedulingSettings']); |
| 767 | + $router->get('/digest-settings', [EmailNotificationController::class, 'getDigestSettings']); | |
| 768 | + $router->post('/digest-settings', [EmailNotificationController::class, 'saveDigestSettings']); | |
| 769 | + $router->post('/digest-settings/send-test', [EmailNotificationController::class, 'sendDigestTest']); | |
| 681 | 770 | $router->post('/enable-notification/{name}', [EmailNotificationController::class, 'enableNotification']); |
| 682 | 771 | $router->post('/send-manual-reminder', [EmailNotificationController::class, 'sendManualReminder']); |
| 683 | 772 | $router->post('/preview-default-template', [EmailNotificationController::class, 'previewDefaultTemplate']); |
| 684 | 773 | $router->get('/{notification}', [EmailNotificationController::class, 'find']); |
| @@ -744,10 +833,10 @@ | ||
| 744 | 833 | }); |
| 745 | 834 | |
| 746 | 835 | $router->post('/upload-editor-file', [FileUploadController::class, 'uploadEditorFile'])->withPolicy('AdminPolicy'); |
| 747 | 836 | |
| 748 | -$router->prefix('notes')->withPolicy('AdminPolicy')->group(function (Router $router) { | |
| 749 | - $router->post('/attach', [NotesController::class, 'attach']); | |
| 837 | +$router->prefix('notes')->withPolicy('OrderPolicy')->group(function (Router $router) { | |
| 838 | + $router->post('/attach', [NotesController::class, 'attach'])->meta(['permissions' => 'orders/manage']); | |
| 750 | 839 | }); |
| 751 | 840 | |
| 752 | 841 | $router->prefix('app')->withPolicy('AdminPolicy')->group(function (Router $router) { |
| 753 | 842 | $router->get('init', [AppController::class, 'init']); |
| @@ -797,40 +886,93 @@ | ||
| 797 | 886 | }); |
| 798 | 887 | |
| 799 | 888 | |
| 800 | 889 | // Tax Routes |
| 801 | -$router->prefix('tax')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) { | |
| 802 | - // TaxClasses routes | |
| 803 | - $router->get('classes', [TaxClassController::class, 'index']); | |
| 804 | - $router->post('classes', [TaxClassController::class, 'store']); | |
| 805 | - $router->put('classes/{id}', [TaxClassController::class, 'update'])->int('id'); | |
| 806 | - $router->delete('classes/{id}', [TaxClassController::class, 'delete'])->int('id'); | |
| 890 | +$router->prefix('tax')->withPolicy('StoreSettingsPolicy')->group(function (Router $router) { | |
| 891 | + // TaxClass routes | |
| 892 | + $router->get('classes', [TaxRateController::class, 'getClasses'])->meta([ | |
| 893 | + 'permissions' => 'store/settings' | |
| 894 | + ]); | |
| 895 | + $router->post('classes', [TaxRateController::class, 'createClass'])->meta([ | |
| 896 | + 'permissions' => 'store/sensitive' | |
| 897 | + ]); | |
| 898 | + $router->delete('classes/{id}', [TaxRateController::class, 'deleteClass'])->int('id')->meta([ | |
| 899 | + 'permissions' => 'store/sensitive' | |
| 900 | + ]); | |
| 807 | 901 | |
| 808 | 902 | // TaxRates routes |
| 809 | - $router->get('rates', [TaxRateController::class, 'index']); | |
| 810 | - $router->get('rates/country/rates/{country_code}', [TaxRateController::class, 'show']); | |
| 811 | - $router->post('rates/country/override', [TaxRateController::class, 'saveShippingOverride']); | |
| 812 | - $router->delete('rates/country/override/{id}', [TaxRateController::class, 'deleteShippingOverride'])->int('id'); | |
| 813 | - $router->put('country/rate/{id}', [TaxRateController::class, 'update'])->int('id'); | |
| 814 | - $router->post('country/rate', [TaxRateController::class, 'store']); | |
| 815 | - $router->delete('country/rate/{id}', [TaxRateController::class, 'delete'])->int('id'); | |
| 816 | - $router->delete('country/{country_code}', [TaxRateController::class, 'deleteCountry']); | |
| 817 | - $router->get('country-tax-id/{country_code}', [TaxRateController::class, 'getCountryTaxId']); | |
| 818 | - $router->post('country-tax-id/{country_code}', [TaxRateController::class, 'saveCountryTaxId']); | |
| 903 | + $router->get('rates', [TaxRateController::class, 'index'])->meta([ | |
| 904 | + 'permissions' => 'store/settings' | |
| 905 | + ]); | |
| 906 | + $router->get('rates/country/rates/{country_code}', [TaxRateController::class, 'show'])->meta([ | |
| 907 | + 'permissions' => 'store/settings' | |
| 908 | + ]); | |
| 909 | + $router->post('rates/country/override', [TaxRateController::class, 'saveShippingOverride'])->meta([ | |
| 910 | + 'permissions' => 'store/sensitive' | |
| 911 | + ]); | |
| 912 | + $router->delete('rates/country/override/{id}', [TaxRateController::class, 'deleteShippingOverride'])->int('id')->meta([ | |
| 913 | + 'permissions' => 'store/sensitive' | |
| 914 | + ]); | |
| 915 | + $router->put('country/rate/{id}', [TaxRateController::class, 'update'])->int('id')->meta([ | |
| 916 | + 'permissions' => 'store/sensitive' | |
| 917 | + ]); | |
| 918 | + $router->post('country/rate', [TaxRateController::class, 'store'])->meta([ | |
| 919 | + 'permissions' => 'store/sensitive' | |
| 920 | + ]); | |
| 921 | + $router->delete('country/rate/{id}', [TaxRateController::class, 'delete'])->int('id')->meta([ | |
| 922 | + 'permissions' => 'store/sensitive' | |
| 923 | + ]); | |
| 924 | + $router->post('country-status/{country_code}', [TaxRateController::class, 'updateCountryStatus'])->meta([ | |
| 925 | + 'permissions' => 'store/sensitive' | |
| 926 | + ]); | |
| 927 | + $router->get('country-tax-id/{country_code}', [TaxRateController::class, 'getCountryTaxId'])->meta([ | |
| 928 | + 'permissions' => 'store/settings' | |
| 929 | + ]); | |
| 930 | + $router->post('country-tax-id/{country_code}', [TaxRateController::class, 'saveCountryTaxId'])->meta([ | |
| 931 | + 'permissions' => 'store/sensitive' | |
| 932 | + ]); | |
| 819 | 933 | |
| 934 | + // Product category tax overrides | |
| 935 | + $router->get('product-overrides/{country_code}', [TaxRateController::class, 'getProductOverrides'])->meta([ | |
| 936 | + 'permissions' => 'store/settings' | |
| 937 | + ]); | |
| 938 | + $router->post('product-overrides', [TaxRateController::class, 'saveProductOverride'])->meta([ | |
| 939 | + 'permissions' => 'store/sensitive' | |
| 940 | + ]); | |
| 941 | + $router->delete('product-overrides/{id}', [TaxRateController::class, 'deleteProductOverride'])->int('id')->meta([ | |
| 942 | + 'permissions' => 'store/sensitive' | |
| 943 | + ]); | |
| 944 | + | |
| 820 | 945 | // $router->post('rates/country', [TaxRateController::class, 'addCountry']); |
| 821 | 946 | |
| 822 | 947 | // TaxConfiguration routes |
| 823 | - $router->get('configuration/rates', [TaxConfigurationController::class, 'getTaxRates']); | |
| 824 | - $router->post('configuration/countries', [TaxConfigurationController::class, 'saveConfiguredCountries']); | |
| 825 | - $router->get('configuration/settings', [TaxConfigurationController::class, 'getSettings']); | |
| 826 | - $router->post('configuration/settings', [TaxConfigurationController::class, 'saveSettings']); | |
| 827 | - $router->post('configuration/settings/eu-vat', [TaxEUController::class, 'saveEuVatSettings']); | |
| 828 | - $router->get('configuration/settings/eu-vat/rates', [TaxEUController::class, 'getEuTaxRates']); | |
| 829 | - $router->post('configuration/settings/eu-vat/oss/override', [TaxEUController::class, 'saveOssTaxOverride']); | |
| 830 | - $router->post('configuration/settings/eu-vat/oss/shipping-override', [TaxEUController::class, 'saveOssShippingOverride']); | |
| 831 | - $router->delete('configuration/settings/eu-vat/oss/override', [TaxEUController::class, 'deleteOssTaxOverride'])->int('id'); | |
| 832 | - $router->delete('configuration/settings/eu-vat/oss/shipping-override', [TaxEUController::class, 'deleteOssShippingOverride'])->int('id'); | |
| 948 | + $router->get('configuration/rates', [TaxConfigurationController::class, 'getTaxRates'])->meta([ | |
| 949 | + 'permissions' => 'store/settings' | |
| 950 | + ]); | |
| 951 | + $router->post('configuration/countries', [TaxConfigurationController::class, 'saveConfiguredCountries'])->meta([ | |
| 952 | + 'permissions' => 'store/sensitive' | |
| 953 | + ]); | |
| 954 | + $router->get('configuration/settings', [TaxConfigurationController::class, 'getSettings'])->meta([ | |
| 955 | + 'permissions' => 'store/settings' | |
| 956 | + ]); | |
| 957 | + $router->post('configuration/settings', [TaxConfigurationController::class, 'saveSettings'])->meta([ | |
| 958 | + 'permissions' => 'store/sensitive' | |
| 959 | + ]); | |
| 960 | + $router->post('configuration/settings/eu-vat', [TaxEUController::class, 'saveEuVatSettings'])->meta([ | |
| 961 | + 'permissions' => 'store/sensitive' | |
| 962 | + ]); | |
| 963 | + $router->post('configuration/settings/eu-vat/reset-rates', [TaxEUController::class, 'resetEuRatesToDefaults'])->meta([ | |
| 964 | + 'permissions' => 'store/sensitive' | |
| 965 | + ]); | |
| 966 | + $router->get('configuration/settings/eu-vat/product-overrides', [TaxEUController::class, 'getEuProductOverrides'])->meta([ | |
| 967 | + 'permissions' => 'store/settings' | |
| 968 | + ]); | |
| 969 | + $router->get('configuration/settings/eu-vat/oss-rates', [TaxEUController::class, 'getOssCountryRates'])->meta([ | |
| 970 | + 'permissions' => 'store/settings' | |
| 971 | + ]); | |
| 972 | + $router->post('configuration/settings/eu-vat/oss-rates', [TaxEUController::class, 'saveOssCountryRates'])->meta([ | |
| 973 | + 'permissions' => 'store/sensitive' | |
| 974 | + ]); | |
| 833 | 975 | }); |
| 834 | 976 | |
| 835 | 977 | $router->prefix('checkout-fields')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) { |
| 836 | 978 | $router->get('get-fields', [CheckoutFieldsController::class, 'getFields']); |