name('business.store-account-passwords.reveal-visible-page'); Route::post('store-account-passwords/{account}/reveal', 'Business\StoreAccountPasswords@reveal') ->name('business.store-account-passwords.reveal'); Route::get('ecommerce-finance/alipay-bills', [AlipayBills::class, 'index']) ->name('ecommerce-finance.alipay-bills.index'); Route::get('ecommerce-finance/alipay-bills/export', [AlipayBills::class, 'export']) ->name('ecommerce-finance.alipay-bills.export'); Route::get('ecommerce-finance/alipay-bills/filter-options', [AlipayBills::class, 'filterOptions']) ->name('ecommerce-finance.alipay-bills.filter-options'); Route::get('ecommerce-finance/alipay-bills/{bill}', [AlipayBills::class, 'show']) ->name('ecommerce-finance.alipay-bills.show'); Route::get('ecommerce-finance/account-bills/type/pinduoduo', [PinduoduoAccountBills::class, 'index']) ->name('ecommerce-finance.pinduoduo-account-bills.index'); Route::get('ecommerce-finance/account-bills/type/pinduoduo/filter-options', [PinduoduoAccountBills::class, 'filterOptions']) ->name('ecommerce-finance.pinduoduo-account-bills.filter-options'); Route::get('ecommerce-finance/account-bills/type/pinduoduo/export', [PinduoduoAccountBills::class, 'export']) ->name('ecommerce-finance.pinduoduo-account-bills.export'); Route::get('ecommerce-finance/account-bills/type/dewu', [DewuAccountBills::class, 'index']) ->name('ecommerce-finance.dewu-account-bills.index'); Route::get('ecommerce-finance/account-bills/type/dewu/filter-options', [DewuAccountBills::class, 'filterOptions']) ->name('ecommerce-finance.dewu-account-bills.filter-options'); Route::get('ecommerce-finance/account-bills/type/dewu/export', [DewuAccountBills::class, 'export']) ->name('ecommerce-finance.dewu-account-bills.export'); Route::get('ecommerce-finance/account-bills/type/taobao-wechat', [TaobaoWechatAccountBills::class, 'index']) ->name('ecommerce-finance.taobao-wechat-account-bills.index'); Route::get('ecommerce-finance/account-bills/type/taobao-wechat/filter-options', [TaobaoWechatAccountBills::class, 'filterOptions']) ->name('ecommerce-finance.taobao-wechat-account-bills.filter-options'); Route::get('ecommerce-finance/account-bills/type/taobao-wechat/export', [TaobaoWechatAccountBills::class, 'export']) ->name('ecommerce-finance.taobao-wechat-account-bills.export'); Route::get('ecommerce-finance/account-bills/type/{bill_type}/promotion-expense-details', [AccountBills::class, 'promotionExpenseDetails']) ->name('ecommerce-finance.account-bills.promotion-expense-details'); Route::get('ecommerce-finance/account-bills/type/{bill_type}', [AccountBills::class, 'index']) ->name('ecommerce-finance.account-bills.index'); Route::get('ecommerce-finance/account-bills/type/{bill_type}/filter-options', [AccountBills::class, 'filterOptions']) ->name('ecommerce-finance.account-bills.filter-options'); Route::get('ecommerce-finance/account-bills/type/{bill_type}/export', [AccountBills::class, 'export']) ->name('ecommerce-finance.account-bills.export'); // 导出进度:所有店铺收款账户账单页签共用(token 按用户隔离)。 Route::get('ecommerce-finance/account-bills/export-progress', [AccountBills::class, 'exportProgress']) ->name('ecommerce-finance.account-bills.export-progress'); // 后台导出任务:新建 / 列表(JSON) / 下载(页面上的「导出进度」弹窗用)。 Route::post('ecommerce-finance/account-bills/export-tasks', [AccountBills::class, 'createExportTask']) ->name('ecommerce-finance.account-bills.export-tasks.create'); Route::get('ecommerce-finance/account-bills/export-tasks/data', [AccountBills::class, 'exportTasks']) ->name('ecommerce-finance.account-bills.export-tasks.data'); Route::get('ecommerce-finance/account-bills/export-tasks/{token}/download', [AccountBills::class, 'downloadExportTask']) ->name('ecommerce-finance.account-bills.export-tasks.download'); Route::post('ecommerce-finance/account-bills/export-tasks/{token}/cancel', [AccountBills::class, 'cancelExportTask']) ->name('ecommerce-finance.account-bills.export-tasks.cancel'); Route::get('ecommerce-finance/account-bills/{bill}', [AccountBills::class, 'show']) ->name('ecommerce-finance.account-bills.show'); Route::prefix('workspace-data/supplier-payables') ->name('workspace-data.supplier-payables.') ->group(function () { Route::get('payment-reconciliation', [GoodsReconciliations::class, 'index']) ->middleware('business.page:supplier-payables,payment-reconciliation') ->name('payment-reconciliation.index'); Route::get('payment-reconciliation/summary', [GoodsReconciliations::class, 'summary']) ->middleware('business.page:supplier-payables,payment-reconciliation') ->name('payment-reconciliation.summary'); Route::get('payment-reconciliation/options', [GoodsReconciliations::class, 'options']) ->middleware('business.page:supplier-payables,payment-reconciliation') ->name('payment-reconciliation.options'); $pages = [ 'return-reconciliation' => 'returnReconciliations', 'invoice-deductions' => 'invoiceDeductions', 'compensation-details' => 'compensationDetails', 'advance-details' => 'advanceDetails', 'delivery-unpriced' => 'deliveryUnpriced', 'return-unpriced' => 'returnUnpriced', 'sample-deductions' => 'sampleDeductions', 'other-adjustments' => 'otherAdjustments', 'dropshipping-express' => 'dropshippingExpress', ]; foreach ($pages as $slug => $action) { Route::get($slug, [SupplierPayables::class, $action . 'Index']) ->middleware('business.page:supplier-payables,' . $slug) ->name($slug . '.index'); Route::get($slug . '/summary', [SupplierPayables::class, $action . 'Summary']) ->middleware('business.page:supplier-payables,' . $slug) ->name($slug . '.summary'); Route::get($slug . '/options', [SupplierPayables::class, $action . 'Options']) ->middleware('business.page:supplier-payables,' . $slug) ->name($slug . '.options'); } }); /** * 'admin' middleware applied to all routes * * @see \App\Providers\Route::mapAdminRoutes * @see \modules\OfflinePayments\Routes\admin.php for module example */ Route::prefix('workspace/courier-payables/quote-management/stock-entries') ->name('business.courier-stock-quotes.') ->middleware('business.page:courier-payables,quote-management') ->group(function () { Route::get('/', [CourierStockQuoteEntries::class, 'create'])->name('create'); Route::get('single', [CourierStockQuoteEntries::class, 'single'])->name('single'); Route::get('courier-names', [CourierStockQuoteEntries::class, 'courierNames'])->name('courier-names'); Route::post('batch-preview', [CourierStockQuoteEntries::class, 'previewBatch'])->name('batch-preview'); Route::get('batches/{batch}', [CourierStockQuoteEntries::class, 'showBatch'])->name('batch'); Route::get('batches/{batch}/images/{sheet}/{file}', [CourierStockQuoteEntries::class, 'batchImage'])->whereNumber(['sheet', 'file'])->name('batch-image'); Route::post('batches/{batch}', [CourierStockQuoteEntries::class, 'saveBatch'])->name('batch-save'); Route::post('/', [CourierStockQuoteEntries::class, 'store'])->name('store'); Route::get('{stockQuoteEntry}/edit', [CourierStockQuoteEntries::class, 'edit'])->name('edit'); Route::patch('{stockQuoteEntry}', [CourierStockQuoteEntries::class, 'update'])->name('update'); Route::post('{stockQuoteEntry}/period-end', [CourierStockQuoteEntries::class, 'periodEnd'])->name('period-end'); Route::get('{stockQuoteEntry}/files/{file}', [CourierStockQuoteEntries::class, 'download'])->whereNumber('file')->name('download'); }); Route::prefix('workspace/courier-payables/quote-management/changes') ->name('business.courier-quote-changes.') ->middleware('business.page:courier-payables,quote-management') ->group(function () { Route::get('/', [CourierQuoteChanges::class, 'index'])->name('index'); Route::get('create', [CourierQuoteChanges::class, 'create'])->name('create'); // 不以 create 结尾:Akaunting 的套餐限制中间件会把 …/create 的 GET 请求跳到用户页。 Route::get('new', [CourierQuoteChanges::class, 'create'])->name('start'); Route::post('/', [CourierQuoteChanges::class, 'store'])->name('store'); Route::post('batch-approve', [CourierQuoteChanges::class, 'batchApprove'])->name('batch-approve'); Route::get('{quoteChange}', [CourierQuoteChanges::class, 'show'])->name('show'); Route::get('{quoteChange}/edit', [CourierQuoteChanges::class, 'edit'])->name('edit'); Route::patch('{quoteChange}', [CourierQuoteChanges::class, 'update'])->name('update'); Route::post('{quoteChange}/submit', [CourierQuoteChanges::class, 'submit'])->name('submit'); Route::post('{quoteChange}/approve', [CourierQuoteChanges::class, 'approve'])->name('approve'); Route::post('{quoteChange}/return', [CourierQuoteChanges::class, 'returnForChanges'])->name('return'); Route::post('{quoteChange}/push-courier', [CourierQuoteChanges::class, 'pushToCourier'])->name('push-courier'); Route::post('{quoteChange}/void', [CourierQuoteChanges::class, 'void'])->name('void'); }); Route::prefix('workspace/courier-payables/quote-management/signatures') ->name('business.courier-quote-signatures.') ->middleware('business.page:courier-payables,quote-management') ->group(function () { Route::get('export', [CourierQuoteSignatures::class, 'export'])->name('export'); Route::get('versions/{quoteVersion}/sheet', [CourierQuoteSignatures::class, 'sheet'])->name('sheet'); Route::post('versions/{quoteVersion}/prepare', [CourierQuoteSignatures::class, 'prepare'])->name('prepare'); Route::post('{quoteSignature}/send', [CourierQuoteSignatures::class, 'send'])->name('send'); Route::post('{quoteSignature}/synchronize', [CourierQuoteSignatures::class, 'synchronize'])->name('synchronize'); Route::get('{quoteSignature}/files/{kind}', [CourierQuoteSignatures::class, 'download'])->name('download'); }); Route::prefix('workspace/courier-payables/courier-onboarding/applications') ->name('business.courier-onboardings.') ->middleware('business.page:courier-payables,courier-onboarding') ->group(function (): void { Route::post('/', [CourierOnboardings::class, 'store'])->name('store'); Route::get('{onboarding}', [CourierOnboardings::class, 'show'])->name('show'); Route::get('{onboarding}/qr', [CourierOnboardings::class, 'qr'])->name('qr'); Route::get('{onboarding}/files/{file}', [CourierOnboardings::class, 'file'])->name('file'); Route::post('{onboarding}/first-approve', [CourierOnboardings::class, 'firstApprove'])->name('first-approve'); Route::post('{onboarding}/return', [CourierOnboardings::class, 'returnForChanges'])->name('return'); Route::post('{onboarding}/reject', [CourierOnboardings::class, 'reject'])->name('reject'); Route::post('{onboarding}/cancel', [CourierOnboardings::class, 'cancel'])->name('cancel'); Route::post('{onboarding}/extend', [CourierOnboardings::class, 'extend'])->name('extend'); Route::post('{onboarding}/internal', [CourierOnboardings::class, 'updateInternal'])->name('internal'); Route::post('{onboarding}/erp-opening', [CourierOnboardings::class, 'erpOpening'])->name('erp-opening'); Route::post('{onboarding}/final-approve', [CourierOnboardings::class, 'finalApprove'])->name('final-approve'); Route::post('{onboarding}/activate', [CourierOnboardings::class, 'activate'])->name('activate'); Route::post('{onboarding}/push-quote', [CourierOnboardings::class, 'pushQuote'])->name('push-quote'); Route::post('{onboarding}/sync-quote', [CourierOnboardings::class, 'syncQuote'])->name('sync-quote'); Route::post('{onboarding}/sign-url', [CourierOnboardings::class, 'signUrl'])->name('sign-url'); Route::get('{onboarding}/requote', [CourierOnboardings::class, 'requote'])->name('requote'); Route::post('{onboarding}/requote', [CourierOnboardings::class, 'storeRequote'])->name('requote.store'); }); Route::prefix('workspace/courier-payables/agreement-signatures') ->name('business.courier-agreement-signatures.') ->middleware('business.page:courier-payables,agreement-signing') ->group(function () { Route::post('/', [CourierAgreementSignatures::class, 'store'])->name('store'); Route::post('subjects', [CourierAgreementSignatures::class, 'storeSubject'])->name('subjects.store'); Route::post('subjects/{subject}/update', [CourierAgreementSignatures::class, 'updateSubject'])->name('subjects.update'); Route::post('subjects/{subject}/default', [CourierAgreementSignatures::class, 'setDefaultSubject'])->name('subjects.default'); Route::delete('subjects/{subject}', [CourierAgreementSignatures::class, 'destroySubject'])->name('subjects.destroy'); Route::get('quote-versions/{quoteVersion}/preview', [CourierAgreementSignatures::class, 'previewQuote'])->name('quotes.preview'); Route::post('{agreementSignature}/synchronize', [CourierAgreementSignatures::class, 'synchronize'])->name('synchronize'); Route::post('{agreementSignature}/archive', [CourierAgreementSignatures::class, 'archive'])->name('archive'); Route::delete('{agreementSignature}', [CourierAgreementSignatures::class, 'destroy'])->name('destroy'); Route::get('{agreementSignature}/files/{kind}', [CourierAgreementSignatures::class, 'download'])->name('download'); Route::post('quote-signatures/{quoteSignature}/synchronize', [CourierAgreementSignatures::class, 'synchronizeQuote'])->name('quotes.synchronize'); Route::delete('quote-signatures/{quoteSignature}', [CourierAgreementSignatures::class, 'destroyQuote'])->name('quotes.destroy'); Route::get('quote-signatures/{quoteSignature}/files/{kind}', [CourierAgreementSignatures::class, 'downloadQuote'])->name('quotes.download'); }); Route::get('workspace/courier-payables/courier-information/contracts/{agreementSignature}/files/{kind}', 'Business\CourierContracts@download') ->middleware('business.page:courier-payables,courier-information') ->name('business.courier-contracts.download'); Route::get('workspace/product-inventory/normal-products/export', 'Business\Pages@exportNormalProducts') ->middleware('business.page:product-inventory,normal-products') ->name('business.product-inventory.normal-products.export'); Route::get('workspace/product-inventory/online-daifa-price/export', 'Business\Pages@exportOnlineDaifaPrice') ->middleware('business.page:product-inventory,online-daifa-price') ->name('business.product-inventory.online-daifa-price.export'); Route::get('workspace/product-inventory/monthly-weighted-average-price/export', 'Business\Pages@exportMonthlyWeightedAveragePrice') ->middleware('permission:read-business-pages') ->name('business.product-inventory.monthly-weighted-average-price.export'); Route::get('workspace/product-inventory/inventory-report/inbound-detail/export', 'Business\Pages@exportInventoryInboundDetail') ->middleware('permission:read-business-pages') ->name('business.product-inventory.inventory-report.inbound-detail.export'); Route::post('workspace/product-inventory/inventory-report/inbound-detail/import', 'Business\Pages@importInventoryInboundDetail') ->middleware(['business.page:product-inventory,inventory-report', 'import']) ->name('business.product-inventory.inventory-report.inbound-detail.import'); Route::get('workspace/product-inventory/inventory-report/export', 'Business\Pages@exportInventoryReport') ->middleware('business.page:product-inventory,inventory-report') ->name('business.product-inventory.inventory-report.export'); Route::get('workspace/product-inventory/monthly-weighted-average-price/export', 'Business\Pages@exportMonthlyWeightedAveragePrice') ->middleware('business.page:product-inventory,monthly-weighted-average-price') ->name('business.product-inventory.monthly-weighted-average-price.export'); Route::get('workspace/planting-data/planting-details/export', 'Business\Pages@exportPlantingDetails') ->middleware('business.page:planting-data,planting-details') ->name('business.planting-data.planting-details.export'); Route::get('workspace/financial-operations/performance-details/export', 'Business\Pages@exportPerformanceDetails') ->middleware('business.page:financial-operations,performance-details') ->name('business.financial-operations.performance-details.export'); Route::get('workspace/financial-operations/performance-details/filter-options', 'Business\Pages@receiptOrderMatchFilterOptions') ->middleware('business.page:financial-operations,performance-details') ->name('business.financial-operations.performance-details.filter-options'); Route::get('workspace/financial-operations/performance-details/metric-details', 'Business\Pages@receiptOrderMatchMetricDetails') ->middleware('business.page:financial-operations,performance-details') ->name('business.financial-operations.performance-details.metric-details'); Route::get('workspace/financial-operations/product-costs/export', 'Business\Pages@exportProductCosts') ->middleware('business.page:financial-operations,product-costs') ->name('business.financial-operations.product-costs.export'); Route::get('workspace/financial-operations/product-costs/summary-details', 'Business\Pages@productCostSummaryDetails') ->middleware('business.page:financial-operations,product-costs') ->name('business.financial-operations.product-costs.summary-details'); Route::get('workspace/financial-operations/product-costs/pending-details', 'Business\Pages@productCostPendingDetails') ->middleware('business.page:financial-operations,product-costs') ->name('business.financial-operations.product-costs.pending-details'); Route::get('workspace/financial-operations/product-costs/pending-details/export', 'Business\Pages@exportProductCostPendingDetails') ->middleware('business.page:financial-operations,product-costs') ->name('business.financial-operations.product-costs.pending-details.export'); Route::get('workspace/financial-operations/financial-analysis/export', 'Business\Pages@exportFinancialAnalysis') ->middleware('business.page:financial-operations,financial-analysis') ->name('business.financial-operations.financial-analysis.export'); Route::get('workspace/planting-data/jst-order-labels/export', 'Business\Pages@exportJstOrderLabels') ->middleware('business.page:planting-data,jst-order-labels') ->name('business.planting-data.jst-order-labels.export'); Route::get('workspace/planting-data/planting-reimbursements/export', [\App\Http\Controllers\Business\PlantingWorkOrders::class, 'exportReimbursements']) ->middleware('business.page:planting-data,planting-reimbursements') ->name('business.planting-data.planting-reimbursements.export'); Route::get('workspace/planting-data/planting-loss/export', [\App\Http\Controllers\Business\PlantingWorkOrders::class, 'exportLoss']) ->middleware('business.page:planting-data,planting-loss') ->name('business.planting-data.planting-loss.export'); Route::prefix('workspace/product-inventory/inventory-report/warehouse-mappings') ->middleware('business.page:product-inventory,inventory-report') ->name('business.product-inventory.inventory-report.warehouse-mappings.') ->group(function () { Route::post('/', 'Business\Pages@storeInventoryWarehouseMapping')->name('store'); Route::patch('{id}', 'Business\Pages@updateInventoryWarehouseMapping')->whereNumber('id')->name('update'); Route::get('export', 'Business\Pages@exportInventoryWarehouseMappings')->name('export'); Route::post('import/preview', 'Business\Pages@previewInventoryWarehouseMappingImport')->middleware('import')->name('import.preview'); Route::post('import/commit', 'Business\Pages@commitInventoryWarehouseMappingImport')->middleware('import')->name('import.commit'); }); Route::prefix('workspace/financial-risk-control/store-violation-alert') ->name('business.store-violation-alert.') ->middleware('business.page:financial-risk-control,store-violation-alert') ->group(function () { Route::get('export', 'Business\Pages@exportStoreViolations')->name('export'); Route::get('template', 'Business\Pages@storeViolationTemplate')->name('template'); Route::post('import/preview', 'Business\Pages@previewStoreViolationImport')->middleware('import')->name('import.preview'); Route::post('import/commit', 'Business\Pages@commitStoreViolationImport')->middleware('import')->name('import.commit'); Route::post('update', 'Business\Pages@updateStoreViolation')->name('update'); Route::get('claim/{record}', 'Business\Pages@claimStoreViolation')->name('claim'); }); Route::prefix('workspace/supplier-payables/product-prices') ->name('business.supplier-payables.product-prices.') ->middleware('business.page:supplier-payables,product-prices') ->group(function () { Route::get('export', [ProductPrices::class, 'export'])->name('export'); Route::get('template', [ProductPrices::class, 'template'])->name('template'); Route::post('import', [ProductPrices::class, 'import'])->middleware('import')->name('import'); Route::patch('{upstreamKey}', [ProductPrices::class, 'update']) ->where('upstreamKey', '[a-f0-9]{64}') ->name('update'); }); $supplierPayableActionPages = [ 'payment-reconciliation', 'return-reconciliation', 'invoice-deductions', 'compensation-details', 'advance-details', 'sample-deductions', 'delivery-unpriced', 'return-unpriced', 'other-adjustments', 'dropshipping-express', 'board-deductions', 'supplier-payables-report', ]; foreach ($supplierPayableActionPages as $dataset) { Route::prefix('workspace/supplier-payables/actions/' . $dataset) ->middleware('business.page:supplier-payables,' . $dataset) ->group(function () use ($dataset) { Route::get('definition', [SupplierPayableActions::class, 'definition'])->defaults('dataset', $dataset); Route::get('export', [SupplierPayableActions::class, 'export'])->defaults('dataset', $dataset); Route::get('template', [SupplierPayableActions::class, 'template'])->defaults('dataset', $dataset); Route::post('import', [SupplierPayableActions::class, 'import'])->middleware('import')->defaults('dataset', $dataset); Route::patch('{recordKey}', [SupplierPayableActions::class, 'update']) ->where('recordKey', '[A-Za-z0-9:_-]+') ->defaults('dataset', $dataset); }); } Route::prefix('workspace/financial-rules/account-mapping/actions') ->name('business.financial-rules.account-mapping.actions.') ->middleware('business.page:financial-rules,account-mapping') ->group(function () { Route::get('rules', [AccountMappingActions::class, 'index'])->name('rules'); Route::post('rules', [AccountMappingActions::class, 'store'])->name('rules.store'); Route::patch('rules/{id}', [AccountMappingActions::class, 'update'])->whereNumber('id')->name('rules.update'); Route::delete('rules/{id}', [AccountMappingActions::class, 'destroy'])->whereNumber('id')->name('rules.destroy'); Route::get('accounts', [AccountMappingActions::class, 'accounts'])->name('accounts'); // 操作记录:新增 / 修改 / 删除 / 导入 / 重置 的历史,供页面「操作记录」查看 Route::get('history', [AccountMappingActions::class, 'history'])->name('history'); Route::get('history/export', [AccountMappingActions::class, 'historyExport'])->name('history.export'); // 恢复:按记录把被删的行建回来 / 把改过的行还原 Route::post('history/restore', [AccountMappingActions::class, 'historyRestore'])->name('history.restore'); // 预览不落盘,所以不挂 throttle:import(限额 1 次/分钟,会卡住「预览→确认」两次请求) Route::post('preview', [AccountMappingActions::class, 'preview'])->name('preview'); Route::post('import', [AccountMappingActions::class, 'import'])->middleware('import')->name('import'); Route::post('reset', [AccountMappingActions::class, 'reset'])->name('reset'); Route::get('export', [AccountMappingActions::class, 'export'])->name('export'); Route::get('template', [AccountMappingActions::class, 'template'])->name('template'); }); // 「终版」目录的按表数据独立存放,界面与基础页面一致。 $payablesFinalDatasets = [ 'supplier-payables-final' => [ 'product-prices', 'payment-reconciliation', 'return-reconciliation', 'invoice-deductions', 'board-deductions', 'compensation-details', 'advance-details', 'sample-deductions', 'other-adjustments', 'delivery-unpriced', 'return-unpriced', 'dropshipping-express', 'supplier-payables-report', ], 'courier-payables-final' => [ 'bookkeeping-details', 'compensation-details', 'advance-details', 'other-adjustments', ], ]; foreach ($payablesFinalDatasets as $finalSection => $finalDatasets) { foreach ($finalDatasets as $dataset) { Route::prefix('workspace/' . $finalSection . '/actions/' . $dataset) ->name('business.' . $finalSection . '.' . $dataset . '.') ->middleware('business.page:' . $finalSection . ',' . $dataset) ->group(function () use ($finalSection, $dataset) { Route::get('definition', [PayablesFinalActions::class, 'definition']) ->defaults('dataset', $dataset)->defaults('finalSection', $finalSection)->name('definition'); Route::get('export', [PayablesFinalActions::class, 'export']) ->defaults('dataset', $dataset)->defaults('finalSection', $finalSection)->name('export'); Route::get('template', [PayablesFinalActions::class, 'template']) ->defaults('dataset', $dataset)->defaults('finalSection', $finalSection)->name('template'); Route::post('import', [PayablesFinalActions::class, 'import']) ->middleware('import') ->defaults('dataset', $dataset)->defaults('finalSection', $finalSection)->name('import'); Route::post('import-upload', [PayablesFinalActions::class, 'importUpload']) ->middleware('import') ->defaults('dataset', $dataset)->defaults('finalSection', $finalSection)->name('import.upload'); Route::post('import-chunk', [PayablesFinalActions::class, 'importChunk']) ->defaults('dataset', $dataset)->defaults('finalSection', $finalSection)->name('import.chunk'); Route::patch('{recordKey}', [PayablesFinalActions::class, 'update']) ->where('recordKey', '[A-Za-z0-9:_-]+') ->defaults('dataset', $dataset)->defaults('finalSection', $finalSection)->name('update'); }); } } // 供应商对账:对账单模板下载 + 厂家对账单上传(严格按模板校验) Route::get('workspace/supplier-portal', [\App\Http\Controllers\Business\SupplierPortal::class, 'home']) ->middleware('business.page:supplier-reconciliation,supplier-data') ->name('business.supplier-portal.home'); Route::get('workspace/supplier-reconciliation/statement-template', [SupplierReconciliationActions::class, 'template']) ->middleware('business.page:supplier-reconciliation,supplier-data') ->name('business.supplier-reconciliation.template'); Route::post('workspace/supplier-reconciliation/statement', [SupplierReconciliationActions::class, 'upload']) ->middleware(['business.page:supplier-reconciliation,supplier-data', 'import']) ->name('business.supplier-reconciliation.statement.upload'); Route::get('workspace/supplier-reconciliation/returns/export', [SupplierReconciliationActions::class, 'exportReturns']) ->middleware('business.page:supplier-reconciliation,supplier-data') ->name('business.supplier-reconciliation.returns.export'); Route::get('workspace/supplier-reconciliation/comparison/export', [SupplierReconciliationActions::class, 'exportComparison']) ->middleware('business.page:supplier-reconciliation,finance-data') ->name('business.supplier-reconciliation.comparison.export'); // 退货扣减确认:逐行确认/异议 + 一键全部确认 Route::post('workspace/supplier-reconciliation/returns/confirm', [SupplierReconciliationActions::class, 'confirmReturn']) ->middleware('business.page:supplier-reconciliation,supplier-data') ->name('business.supplier-reconciliation.return.confirm'); Route::post('workspace/supplier-reconciliation/returns/dispute', [SupplierReconciliationActions::class, 'disputeReturn']) ->middleware('business.page:supplier-reconciliation,supplier-data') ->name('business.supplier-reconciliation.return.dispute'); Route::post('workspace/supplier-reconciliation/returns/confirm-all', [SupplierReconciliationActions::class, 'confirmAllReturns']) ->middleware('business.page:supplier-reconciliation,supplier-data') ->name('business.supplier-reconciliation.return.confirm-all'); Route::post('workspace/supplier-reconciliation/dingtalk-robot', [SupplierReconciliationActions::class, 'saveDingTalkRobot']) ->middleware('business.page:supplier-reconciliation,finance-data') ->name('business.supplier-reconciliation.dingtalk-robot.save'); Route::post('workspace/supplier-reconciliation/push-differences', [SupplierReconciliationActions::class, 'pushDifferences']) ->middleware('business.page:supplier-reconciliation,finance-data') ->name('business.supplier-reconciliation.push-differences'); Route::post('workspace/supplier-negative-alerts/dingtalk-group', [SupplierNegativeAlertDingTalkActions::class, 'saveRobot']) ->middleware(['business.page:negative-alerts,supplier-negative-alert', 'throttle:10,1']) ->name('business.supplier-negative-alerts.dingtalk-group.save'); Route::post('workspace/supplier-negative-alerts/send-dingtalk', [SupplierNegativeAlertDingTalkActions::class, 'send']) ->middleware(['business.page:negative-alerts,supplier-negative-alert', 'throttle:10,1']) ->name('business.supplier-negative-alerts.send-dingtalk'); Route::get('workspace/refunds/non-jingxi-refund-data/export', 'Business\Pages@exportNonJingxiRefunds') ->middleware('business.page:refunds,non-jingxi-refund-data') ->name('business.refunds.non-jingxi-refund-data.export'); Route::get('workspace/other/after-sales-return-refund/export', 'Business\Pages@exportAfterSalesReturnRefunds') ->middleware('business.page:other,after-sales-return-refund') ->name('business.other.after-sales-return-refund.export'); Route::get('workspace/financial-operations/small-payment-work-orders/export', 'Business\Pages@exportSmallPaymentWorkOrders') ->middleware('business.page:financial-operations,small-payment-work-orders') ->name('business.financial-operations.small-payment-work-orders.export'); Route::get('workspace/refunds/small-payment-work-orders/export', 'Business\Pages@exportSmallPaymentWorkOrders') ->middleware('business.page:financial-operations,small-payment-work-orders') ->name('business.refunds.small-payment-work-orders.export'); Route::prefix('workspace/courier-payables/courier-information/profiles') ->name('business.courier-profiles.') ->middleware('business.page:courier-payables,courier-information') ->group(function (): void { Route::post('payment-accounts', [CourierProfiles::class, 'storePaymentAccountForCode'])->name('payment-accounts.store-any'); Route::post('{expcode}', [CourierProfiles::class, 'update'])->name('update')->where('expcode', '[0-9A-Za-z_\\-]+'); Route::post('{expcode}/payment-accounts', [CourierProfiles::class, 'storePaymentAccount'])->name('payment-accounts.store')->where('expcode', '[0-9A-Za-z_\\-]+'); }); Route::get('workspace/courier-payables/courier-information/export', 'Business\Pages@exportCourierInformation') ->middleware('business.page:courier-payables,courier-information') ->name('business.courier-payables.courier-information.export'); Route::prefix('workspace/courier-payables/accessory-reship-deductions/configs') ->name('business.accessory-reship-configs.') ->middleware('business.page:courier-payables,accessory-reship-deductions') ->group(function (): void { $controller = \App\Http\Controllers\Business\AccessoryReshipCourierConfigs::class; Route::get('export', [$controller, 'export'])->name('export'); Route::post('import', [$controller, 'import'])->name('import'); Route::post('/', [$controller, 'store'])->name('store'); Route::patch('{configId}', [$controller, 'update'])->whereNumber('configId')->name('update'); Route::delete('{configId}', [$controller, 'destroy'])->whereNumber('configId')->name('destroy'); Route::post('{configId}/restore', [$controller, 'restore'])->whereNumber('configId')->name('restore'); }); Route::post('workspace/courier-payables/accessory-reship-deductions/selection', [\App\Http\Controllers\Business\AccessoryReshipDeductions::class, 'selectCourier']) ->middleware('business.page:courier-payables,accessory-reship-deductions') ->name('business.accessory-reship-deductions.selection'); Route::get('workspace/courier-payables/accessory-reship-deductions/export', [\App\Http\Controllers\Business\AccessoryReshipDeductions::class, 'export']) ->middleware('business.page:courier-payables,accessory-reship-deductions') ->name('business.accessory-reship-deductions.export'); Route::get('workspace/supplier-payables/accessory-freight-deductions/export', [\App\Http\Controllers\Business\SupplierAccessoryFreight::class, 'export']) ->middleware('business.page:supplier-payables,accessory-freight-deductions') ->name('business.supplier-accessory-freight.export'); Route::get('workspace/supplier-payables/manufacturer-bookkeeping/export', [\App\Http\Controllers\Business\SupplierBookkeeping::class, 'export']) ->middleware('business.page:supplier-payables,manufacturer-bookkeeping') ->name('business.supplier-bookkeeping.export'); Route::prefix('workspace/supplier-payables/manufacturer-bookkeeping/configs') ->name('business.supplier-bookkeeping-configs.') ->middleware('business.page:supplier-payables,manufacturer-bookkeeping') ->group(function (): void { $controller = \App\Http\Controllers\Business\SupplierBookkeepingConfigs::class; Route::get('export', [$controller, 'export'])->name('export'); Route::post('import', [$controller, 'import'])->name('import'); Route::post('/', [$controller, 'store'])->name('store'); Route::patch('{configId}', [$controller, 'update'])->whereNumber('configId')->name('update'); Route::delete('{configId}', [$controller, 'destroy'])->whereNumber('configId')->name('destroy'); Route::post('{configId}/restore', [$controller, 'restore'])->whereNumber('configId')->name('restore'); }); Route::get('workspace/courier-payables/shipping-data/export', 'Business\Pages@exportShippingData') ->middleware('business.page:courier-payables,shipping-data') ->name('business.courier-payables.shipping-data.export'); Route::get('workspace/courier-payables/shipping-data/suggest', 'Business\\Pages@suggestShippingData') ->middleware('business.page:courier-payables,shipping-data') ->name('business.courier-payables.shipping-data.suggest'); Route::get('workspace/courier-payables/return-pickup-management/export', 'Business\Pages@exportReturnPickupManagement') ->middleware('business.page:courier-payables,return-pickup-management') ->name('business.courier-payables.return-pickup-management.export'); Route::get('workspace/courier-payables/return-pickup-management/detail', 'Business\Pages@returnPickupManagementDetail') ->middleware('business.page:courier-payables,return-pickup-management') ->name('business.courier-payables.return-pickup-management.detail'); Route::get('workspace/courier-payables/payable-cloud-warehouse-vehicle-fee/attachment', 'Business\Pages@downloadDingPayableAttachment') ->middleware('business.page:courier-payables,payable-cloud-warehouse-vehicle-fee') ->name('business.courier-payables.ding-payable-attachment.download'); // 必须注册在通用 {section}/{page}/{tab}/export 之前,否则会被通用导出路由截获。 Route::get('workspace/courier-payables/courier-surcharge/settlement/export', 'Business\Pages@exportCourierSurchargeSettlement') ->middleware('business.page:courier-payables,courier-surcharge') ->name('business.courier-surcharge.settlement.export'); Route::post('workspace/courier-payables/courier-surcharge/settlement/import', 'Business\Pages@importCourierSurchargeSettlement') ->middleware('business.page:courier-payables,courier-surcharge') ->name('business.courier-surcharge.settlement.import'); Route::get('workspace/courier-payables/courier-surcharge/settlement/import-template', 'Business\Pages@downloadCourierSurchargeSettlementImportTemplate') ->middleware('business.page:courier-payables,courier-surcharge') ->name('business.courier-surcharge.settlement.import-template'); Route::get('workspace/courier-payables/third-party-warehouse-storage/export', 'Business\Pages@exportThirdPartyWarehouseStorage') ->middleware('business.page:courier-payables,third-party-warehouse-storage') ->name('business.courier-payables.third-party-warehouse-storage.export'); Route::get('workspace/courier-payables/third-party-warehouse-storage/settlement-export', [ThirdPartyWarehouseStorageSettlementExportController::class, 'export']) ->middleware('business.page:courier-payables,third-party-warehouse-storage') ->name('business.courier-payables.third-party-warehouse-storage.settlement-export'); // 必须注册在通用 {section}/{page}/{tab}/export 之前,否则会被通用导出路由截获。 Route::get('workspace/other/systemization-todos/history/export', [SystemizationTodos::class, 'historyExport']) ->middleware('business.page:other,systemization-todos') ->name('business.systemization-todos.history.export'); Route::middleware('business.page.viewer')->group(function (): void { Route::get('workspace/{section}/{page}/{tab}/export', 'Business\Pages@export') ->name('business.pages.export'); Route::get('workspace/{section}/{page}/{tab}/template', 'Business\Pages@storeReceivingAccountTemplate') ->name('business.pages.store-receiving-account-template'); }); Route::get('workspace/fund-management/fund-forecast/template', 'Business\Pages@fundForecastTemplate') ->middleware('business.page:fund-management,fund-forecast') ->name('business.fund-forecast.template'); Route::get('workspace/financial-operations/installation-details/summary', 'Business\Pages@installationDetailsSummary') ->name('business.installation-details.summary'); Route::get('workspace/financial-operations/installation-details/details/{guid}', 'Business\Pages@installationDetails') ->where('guid', '[A-Za-z0-9-]+') ->name('business.installation-details.details'); Route::get('workspace/financial-operations/installation-details/export', 'Business\Pages@exportInstallationDetails') ->name('business.installation-details.export'); Route::get('workspace/trademark-management/store-report-data-logic/edit', 'Business\Pages@editStoreReportLogic') ->middleware('business.page:trademark-management,store-report-data-logic') ->name('business.store-report-logic.edit'); Route::get('workspace/trademark-management/tax-forecast-data-logic/edit', 'Business\Pages@editTaxForecastLogic') ->middleware('business.page:trademark-management,tax-forecast-data-logic') ->name('business.tax-forecast-logic.edit'); Route::post('workspace/trademark-management/tax-forecast-data-logic/edit', 'Business\Pages@updateTaxForecastLogic') ->middleware('business.page:trademark-management,tax-forecast-data-logic') ->name('business.tax-forecast-logic.update'); Route::get('workspace/financial-operations/expense-details/export', 'Business\Pages@exportExpenseDetails') ->middleware('business.page:financial-operations,expense-details') ->name('business.financial-operations.expense-details.export'); Route::get('workspace/financial-operations/expense-details/export-progress', 'Business\Pages@billingDetailsExportProgress') ->middleware('business.page:financial-operations,expense-details') ->name('business.financial-operations.expense-details.export-progress'); Route::get('workspace/financial-operations/expense-details/filter-options', 'Business\Pages@expenseDetailsFilterOptions') ->middleware('business.page:financial-operations,expense-details') ->name('business.financial-operations.expense-details.filter-options'); Route::get('workspace/financial-operations/expense-details/item-summary', 'Business\Pages@expenseDetailsItemSummary') ->middleware('business.page:financial-operations,expense-details') ->name('business.financial-operations.expense-details.item-summary'); Route::get('workspace/financial-operations/billing-details/export', 'Business\Pages@exportBillingDetails') ->middleware('business.page:financial-operations,billing-details') ->name('business.financial-operations.billing-details.export'); Route::get('workspace/financial-operations/billing-details/export-progress', 'Business\Pages@billingDetailsExportProgress') ->middleware('business.page:financial-operations,billing-details') ->name('business.financial-operations.billing-details.export-progress'); Route::get('workspace/financial-operations/billing-details/filter-options', 'Business\Pages@billingDetailsFilterOptions') ->middleware('business.page:financial-operations,billing-details') ->name('business.financial-operations.billing-details.filter-options'); Route::get('workspace/order-data/bill-offset/export', 'Business\Pages@exportBillOffset') ->middleware('business.page:order-data,bill-offset') ->name('business.bill-offset.export'); Route::prefix('workspace/fund-management/withdrawal-management') ->name('business.withdrawal-management.') ->middleware('business.page:fund-management,withdrawal-management') ->group(function () { Route::get('export', [WithdrawalManagement::class, 'export'])->name('export'); Route::get('template', [WithdrawalManagement::class, 'template'])->name('template'); Route::get('template/withdrawals', [WithdrawalManagement::class, 'withdrawalTemplate'])->name('template.withdrawals'); Route::post('import/preview', [WithdrawalManagement::class, 'importPreview']) ->middleware('import') ->name('import.preview'); Route::post('import/commit', [WithdrawalManagement::class, 'importCommit']) ->name('import.commit'); }); Route::prefix('workspace/courier-payables/courier-surcharge') ->name('business.courier-surcharge.') ->middleware('business.page:courier-payables,courier-surcharge') ->group(function () { Route::get('import-template', [CourierSurchargeQuotes::class, 'importTemplate'])->name('import.template'); Route::post('import/preview', [CourierSurchargeQuotes::class, 'importPreview'])->name('import.preview'); Route::post('import/commit', [CourierSurchargeQuotes::class, 'importCommit'])->name('import.commit'); Route::post('/', [CourierSurchargeQuotes::class, 'store'])->name('store'); Route::patch('{quote}', [CourierSurchargeQuotes::class, 'update'])->name('update'); Route::post('{quote}/status', [CourierSurchargeQuotes::class, 'setStatus'])->name('status'); Route::post('types', [CourierSurchargeTypes::class, 'store'])->name('types.store'); Route::post('types/{type}/status', [CourierSurchargeTypes::class, 'setStatus'])->name('types.status'); }); Route::post('workspace/courier-payables/{summaryPage}/summary-import', [CourierPayableSummaries::class, 'import']) ->where('summaryPage', 'freight-difference|other-surcharge-summary|return-fee') ->name('business.courier-payable-summaries.import'); Route::get('workspace/courier-payables/{summaryPage}/summary-template', [CourierPayableSummaries::class, 'template']) ->where('summaryPage', 'freight-difference|other-surcharge-summary|return-fee') ->name('business.courier-payable-summaries.template'); Route::get('workspace/courier-payables/{summaryPage}/summary-export', [CourierPayableSummaries::class, 'export']) ->where('summaryPage', 'freight-difference|other-surcharge-summary|return-fee') ->name('business.courier-payable-summaries.export'); Route::post('workspace/trademark-management/store-report-data-logic/shops', 'Business\Pages@updateStoreReportInitialPeriod') ->middleware('business.page:trademark-management,store-report-data-logic') ->name('business.store-report-logic.shops.save'); Route::delete('workspace/trademark-management/store-report-data-logic/shops', 'Business\Pages@destroyStoreReportInitialPeriod') ->middleware('business.page:trademark-management,store-report-data-logic') ->name('business.store-report-logic.shops.destroy'); Route::get('workspace/supplier-payables/supplier-management/export', [\App\Http\Controllers\Business\SupplierManagement::class, 'export']) ->middleware('business.page:supplier-payables,supplier-management') ->name('business.supplier-management.export'); Route::get('workspace/supplier-payables/supplier-management/free-shipping-manufacturer-template', [\App\Http\Controllers\Business\SupplierManagement::class, 'template']) ->middleware('business.page:supplier-payables,supplier-management') ->name('business.supplier-management.free-shipping.template'); Route::post('workspace/supplier-payables/supplier-management/free-shipping-manufacturer-import', [\App\Http\Controllers\Business\SupplierManagement::class, 'import']) ->middleware(['business.page:supplier-payables,supplier-management', 'import']) ->name('business.supplier-management.free-shipping.import'); Route::patch('workspace/supplier-payables/supplier-management/free-shipping-manufacturer/{supplier}', [\App\Http\Controllers\Business\SupplierManagement::class, 'updateFreeShipping']) ->whereNumber('supplier') ->middleware('business.page:supplier-payables,supplier-management') ->name('business.supplier-management.free-shipping.update'); Route::post('workspace/financial-operations/ledger/mapping/{id}', [\App\Http\Controllers\Business\FinanceLedger::class, 'updateMapping']) ->whereNumber('id') ->middleware('business.page:financial-operations,ledger') ->name('business.financial-operations.ledger.mapping.update'); // Keep already-open ledger pages working while they post to the previous URL. Route::post('workspace/financial-ledger/mapping/{id}', [\App\Http\Controllers\Business\FinanceLedger::class, 'updateMapping']) ->whereNumber('id') ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.mapping.update'); Route::post('workspace/financial-ledger/transactions/manual', [\App\Http\Controllers\Business\FinanceLedger::class, 'storeManualTransaction']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.transactions.manual'); Route::post('workspace/financial-ledger/shop-data/sync', [\App\Http\Controllers\Business\FinanceLedger::class, 'syncShopData']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.shop-data.sync'); Route::post('workspace/financial-ledger/transactions/{id}/account', [\App\Http\Controllers\Business\FinanceLedger::class, 'updateTransactionAccount']) ->whereNumber('id') ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.transactions.account.update'); Route::post('workspace/financial-ledger/accounts/status', [\App\Http\Controllers\Business\FinanceLedger::class, 'updateAccountStatus']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.accounts.status'); Route::post('workspace/financial-ledger/accounts', [\App\Http\Controllers\Business\FinanceLedger::class, 'storeAccount']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.accounts.store'); Route::post('workspace/financial-ledger/accounts/type', [\App\Http\Controllers\Business\FinanceLedger::class, 'updateAccountType']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.accounts.type'); Route::post('workspace/financial-ledger/accounts/plan', [\App\Http\Controllers\Business\FinanceLedger::class, 'updateAccountPlan']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.accounts.plan'); Route::post('workspace/financial-ledger/accounts/keep', [\App\Http\Controllers\Business\FinanceLedger::class, 'updateAccountKeep']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.accounts.keep'); Route::get('workspace/financial-ledger/accounts/template', [\App\Http\Controllers\Business\FinanceLedger::class, 'downloadAccountTemplate']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.accounts.template'); Route::post('workspace/financial-ledger/mapping/shop/preview', [\App\Http\Controllers\Business\FinanceLedger::class, 'previewShopMapping']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.mapping.shop.preview'); Route::post('workspace/financial-ledger/mapping/shop/apply', [\App\Http\Controllers\Business\FinanceLedger::class, 'applyShopMapping']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.mapping.shop.apply'); Route::post('workspace/financial-ledger/mapping/payable/preview', [\App\Http\Controllers\Business\FinanceLedger::class, 'previewPayableMapping']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.mapping.payable.preview'); Route::post('workspace/financial-ledger/mapping/payable/apply', [\App\Http\Controllers\Business\FinanceLedger::class, 'applyPayableMapping']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.mapping.payable.apply'); Route::get('workspace/financial-operations/ledger/unavailable-balances', [\App\Http\Controllers\Business\FinanceLedger::class, 'unavailableBalanceTasks']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.unavailable-balances'); Route::get('workspace/financial-operations/ledger/unretained-accounts', [\App\Http\Controllers\Business\FinanceLedger::class, 'unretainedAccountTasks']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.unretained-accounts'); Route::post('workspace/financial-ledger/accounts/todo', [\App\Http\Controllers\Business\FinanceLedger::class, 'updateAccountTodo']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.accounts.todo'); Route::post('workspace/financial-ledger/accounts/keep-todo', [\App\Http\Controllers\Business\FinanceLedger::class, 'updateAccountKeepTodo']) ->middleware('business.page:financial-operations,ledger') ->name('business.financial-ledger.accounts.keep-todo'); Route::prefix('workspace/other/systemization-todos') ->name('business.systemization-todos.') ->middleware('business.page:other,systemization-todos') ->group(function (): void { Route::post('import', [SystemizationTodos::class, 'importWorkbook']) ->middleware('import') ->name('import'); Route::post('column-widths', [SystemizationTodos::class, 'saveColumnWidths']) ->name('column-widths'); Route::post('/', [SystemizationTodos::class, 'store'])->name('store'); Route::get('history', [SystemizationTodos::class, 'history'])->name('history'); Route::patch('grid/cells', [SystemizationTodos::class, 'batchUpdateCells']) ->name('grid-cells'); Route::post('grid/create', [SystemizationTodos::class, 'createGridRow']) ->name('grid-create'); Route::patch('grid/{todo}/move', [SystemizationTodos::class, 'moveGridRow']) ->whereNumber('todo') ->name('grid-move'); Route::post('grid/{todo}/insert-after', [SystemizationTodos::class, 'insertGridRowAfter']) ->whereNumber('todo') ->name('grid-insert'); Route::post('grid/{todo}/attachments', [SystemizationTodos::class, 'uploadGridAttachments']) ->whereNumber('todo') ->name('grid-upload'); Route::delete('grid/{todo}/attachments/{attachment}', [SystemizationTodos::class, 'destroyGridAttachment']) ->whereNumber(['todo', 'attachment']) ->name('grid-attachment-destroy'); Route::patch('{todo}/category', [SystemizationTodos::class, 'updateCategory']) ->whereNumber('todo') ->name('category'); Route::patch('{todo}/section', [SystemizationTodos::class, 'updateSection']) ->whereNumber('todo') ->name('section'); Route::patch('{todo}', [SystemizationTodos::class, 'update']) ->whereNumber('todo') ->name('update'); Route::delete('{todo}', [SystemizationTodos::class, 'destroy']) ->whereNumber('todo') ->name('destroy'); Route::get('{todo}/attachments/{attachment}', [SystemizationTodos::class, 'attachment']) ->whereNumber('todo') ->whereNumber('attachment') ->name('attachments.show'); }); Route::get('workspace/financial-ledger/{page?}/{tab?}', function (Request $request, ?string $page = null, ?string $tab = null) { abort_unless($page === null || $page === 'ledger', 404); $query = $request->query(); if ($tab !== null) { $query['tab'] = $tab; } $target = route('business.pages.show', [ 'section' => 'financial-operations', 'page' => 'ledger', ]); return redirect()->to($query === [] ? $target : $target . '?' . http_build_query($query)); })->name('business.financial-ledger.legacy'); Route::middleware('business.page.viewer')->group(function (): void { Route::get('workspace/{section}/{page?}/{tab?}', 'Business\Pages@show') ->name('business.pages.show'); Route::post('workspace/{section}/{page}/import/{tab?}', 'Business\Pages@import') ->middleware('import') ->name('business.pages.import'); Route::post('workspace/{section}/{page}/{tab?}', 'Business\Pages@store') ->name('business.pages.store'); Route::patch('workspace/{section}/{page}/{id}/{tab?}', 'Business\Pages@update') ->name('business.pages.update'); Route::delete('workspace/{section}/{page}/{id}/{tab?}', 'Business\Pages@destroy') ->name('business.pages.destroy'); }); Route::group(['as' => 'system-settings.', 'prefix' => 'system-settings'], function () { Route::resource('groups', 'SystemSettings\UserGroups')->except('show'); Route::get('users', 'SystemSettings\Users@index')->name('users.index'); Route::get('users/create', 'SystemSettings\Users@create')->name('users.create'); Route::post('users', 'SystemSettings\Users@store')->name('users.store'); Route::get('users/{user}/edit', 'SystemSettings\Users@edit')->name('users.edit'); Route::get('users/{user}/groups', 'SystemSettings\UserGroups@editMembership')->name('groups.membership.edit'); Route::patch('users/{user}/groups', 'SystemSettings\UserGroups@updateMembership')->name('groups.membership.update'); Route::patch('users/{user}', 'SystemSettings\Users@update')->name('users.update'); Route::delete('users/{user}', 'SystemSettings\Users@destroy')->name('users.destroy'); Route::get('dingtalk-bindings', 'SystemSettings\DingTalkBindings@index')->name('dingtalk-bindings.index'); Route::post('dingtalk-bindings/{bindingRequest}/approve', 'SystemSettings\DingTalkBindings@approve')->name('dingtalk-bindings.approve'); Route::post('dingtalk-bindings/{bindingRequest}/reject', 'SystemSettings\DingTalkBindings@reject')->name('dingtalk-bindings.reject'); Route::delete('dingtalk-bindings/identities/{identity}', 'SystemSettings\DingTalkBindings@destroy')->name('dingtalk-bindings.destroy'); Route::get('permissions', 'SystemSettings\Sidebar@index')->name('permissions.index'); Route::get('workflow-reviewers', 'SystemSettings\WorkflowReviewers@index')->name('workflow-reviewers.index'); Route::get('workflow-reviewers/search', 'SystemSettings\WorkflowReviewers@search')->name('workflow-reviewers.search'); Route::patch('workflow-reviewers', 'SystemSettings\WorkflowReviewers@update')->name('workflow-reviewers.update'); Route::get('sidebar', 'SystemSettings\Sidebar@edit')->name('sidebar.edit'); Route::patch('sidebar', 'SystemSettings\Sidebar@update')->name('sidebar.update'); Route::get('databases', 'SystemSettings\Databases@index')->name('databases.index'); Route::get('databases/system/edit', 'SystemSettings\Databases@editSystem')->name('databases.system.edit'); Route::patch('databases/system', 'SystemSettings\Databases@updateSystem')->name('databases.system.update'); Route::get('databases/dictionary', 'SystemSettings\Databases@dictionary')->name('databases.dictionary'); Route::get('databases/create', 'SystemSettings\Databases@create')->name('databases.create'); Route::post('databases', 'SystemSettings\Databases@store')->name('databases.store'); Route::get('databases/{connection}/edit', 'SystemSettings\Databases@edit')->name('databases.edit'); Route::patch('databases/{connection}', 'SystemSettings\Databases@update')->name('databases.update'); Route::delete('databases/{connection}', 'SystemSettings\Databases@destroy')->name('databases.destroy'); Route::post('databases/{connection}/test', 'SystemSettings\Databases@test')->name('databases.test'); }); Route::group(['as' => 'uploads.', 'prefix' => 'uploads'], function () { Route::get('{id}/inline', 'Common\Uploads@inline')->name('inline'); Route::delete('{id}', 'Common\Uploads@destroy')->name('destroy'); }); Route::group(['prefix' => 'common'], function () { Route::get('companies/autocomplete', 'Common\Companies@autocomplete')->name('companies.autocomplete'); Route::get('companies/{company}/switch', 'Common\Companies@switch')->name('companies.switch'); Route::get('companies/{company}/enable', 'Common\Companies@enable')->name('companies.enable'); Route::get('companies/{company}/disable', 'Common\Companies@disable')->name('companies.disable'); Route::resource('companies', 'Common\Companies', ['middleware' => ['dropzone']]); Route::get('dashboards/{dashboard}/switch', 'Common\Dashboards@switch')->name('dashboards.switch'); Route::get('dashboards/{dashboard}/enable', 'Common\Dashboards@enable')->name('dashboards.enable'); Route::get('dashboards/{dashboard}/disable', 'Common\Dashboards@disable')->name('dashboards.disable'); Route::resource('dashboards', 'Common\Dashboards'); Route::post('widgets/getData', 'Common\Widgets@getData')->name('widgets.getData'); Route::resource('widgets', 'Common\Widgets'); Route::get('import/{group}/{type}/{route?}', 'Common\Import@create')->name('import.create'); Route::get('items/autocomplete', 'Common\Items@autocomplete')->name('items.autocomplete'); Route::get('items/{item}/enable', 'Common\Items@enable')->name('items.enable'); Route::get('items/{item}/disable', 'Common\Items@disable')->name('items.disable'); Route::get('items/{item}/duplicate', 'Common\Items@duplicate')->name('items.duplicate'); Route::post('items/import', 'Common\Items@import')->middleware('import')->name('items.import'); Route::get('items/export', 'Common\Items@export')->name('items.export'); Route::resource('items', 'Common\Items', ['middleware' => ['money', 'dropzone']]); Route::post('bulk-actions/{group}/{type}', 'Common\BulkActions@action')->name('bulk-actions.action'); Route::get('reports/{report}/print', 'Common\Reports@print')->name('reports.print'); Route::get('reports/{report}/pdf', 'Common\Reports@pdf')->name('reports.pdf'); Route::get('reports/{report}/export', 'Common\Reports@export')->name('reports.export'); Route::get('reports/{report}/duplicate', 'Common\Reports@duplicate')->name('reports.duplicate'); Route::get('reports/{report}/clear', 'Common\Reports@clear')->name('reports.clear'); Route::get('reports/fields', 'Common\Reports@fields')->name('reports.fields'); Route::resource('reports', 'Common\Reports'); Route::get('contacts/index', 'Common\Contacts@index')->name('contacts.index'); Route::get('plans/check', 'Common\Plans@check')->name('plans.check'); }); Route::group(['prefix' => 'auth'], function () { Route::get('logout', 'Auth\Login@destroy')->name('logout'); Route::get('users/autocomplete', 'Auth\Users@autocomplete')->name('users.autocomplete'); Route::get('users/landingpages', 'Auth\Users@landingPages')->name('users.landingpages'); Route::get('users/{user}/read-bills', 'Auth\Users@readUpcomingBills')->name('users.read.bills'); Route::get('users/{user}/read-invoices', 'Auth\Users@readOverdueInvoices')->name('users.read.invoices'); Route::get('users/{user}/enable', 'Auth\Users@enable')->name('users.enable'); Route::get('users/{user}/disable', 'Auth\Users@disable')->name('users.disable'); Route::get('users/{user}/invite', 'Auth\Users@invite')->name('users.invite'); Route::resource('users', 'Auth\Users', ['middleware' => ['dropzone']]); Route::get('profile/{user}/edit', 'Auth\Users@edit')->name('profile.edit'); Route::patch('profile/{user}', 'Auth\Users@update')->middleware('dropzone')->name('profile.update'); }); Route::group(['prefix' => 'sales'], function () { Route::get('invoices/{invoice}/sent', 'Sales\Invoices@markSent')->name('invoices.sent'); Route::get('invoices/{invoice}/cancelled', 'Sales\Invoices@markCancelled')->name('invoices.cancelled'); Route::get('invoices/{invoice}/restore', 'Sales\Invoices@restoreInvoice')->name('invoices.restore'); Route::get('invoices/{invoice}/email', 'Sales\Invoices@emailInvoice')->name('invoices.email'); Route::get('invoices/{invoice}/print', 'Sales\Invoices@printInvoice')->name('invoices.print'); Route::get('invoices/{invoice}/pdf', 'Sales\Invoices@pdfInvoice')->name('invoices.pdf'); Route::get('invoices/{invoice}/duplicate', 'Sales\Invoices@duplicate')->name('invoices.duplicate'); Route::post('invoices/import', 'Sales\Invoices@import')->middleware('import')->name('invoices.import'); Route::get('invoices/export', 'Sales\Invoices@export')->name('invoices.export'); Route::resource('invoices', 'Sales\Invoices', ['middleware' => ['date.format', 'money', 'dropzone']]); Route::get('recurring-invoices/{recurring_invoice}/duplicate', 'Sales\RecurringInvoices@duplicate')->name('recurring-invoices.duplicate'); Route::get('recurring-invoices/{recurring_invoice}/end', 'Sales\RecurringInvoices@end')->name('recurring-invoices.end'); Route::post('recurring-invoices/import', 'Sales\RecurringInvoices@import')->middleware('import')->name('recurring-invoices.import'); Route::get('recurring-invoices/export', 'Sales\RecurringInvoices@export')->name('recurring-invoices.export'); Route::resource('recurring-invoices', 'Sales\RecurringInvoices', ['middleware' => ['date.format', 'money', 'dropzone']]); Route::get('customers/{customer}/create-invoice', 'Sales\Customers@createInvoice')->name('customers.create-invoice'); Route::get('customers/{customer}/create-income', 'Sales\Customers@createIncome')->name('customers.create-income'); Route::get('customers/{customer}/enable', 'Sales\Customers@enable')->name('customers.enable'); Route::get('customers/{customer}/disable', 'Sales\Customers@disable')->name('customers.disable'); Route::get('customers/{customer}/duplicate', 'Sales\Customers@duplicate')->name('customers.duplicate'); Route::post('customers/import', 'Sales\Customers@import')->middleware('import')->name('customers.import'); Route::get('customers/export', 'Sales\Customers@export')->name('customers.export'); Route::resource('customers', 'Sales\Customers'); }); Route::group(['prefix' => 'purchases'], function () { Route::get('bills/{bill}/received', 'Purchases\Bills@markReceived')->name('bills.received'); Route::get('bills/{bill}/cancelled', 'Purchases\Bills@markCancelled')->name('bills.cancelled'); Route::get('bills/{bill}/restore', 'Purchases\Bills@restoreBill')->name('bills.restore'); Route::get('bills/{bill}/print', 'Purchases\Bills@printBill')->name('bills.print'); Route::get('bills/{bill}/pdf', 'Purchases\Bills@pdfBill')->name('bills.pdf'); Route::get('bills/{bill}/duplicate', 'Purchases\Bills@duplicate')->name('bills.duplicate'); Route::post('bills/import', 'Purchases\Bills@import')->middleware('import')->name('bills.import'); Route::get('bills/export', 'Purchases\Bills@export')->name('bills.export'); Route::resource('bills', 'Purchases\Bills', ['middleware' => ['date.format', 'money', 'dropzone']]); Route::get('recurring-bills/{recurring_bill}/duplicate', 'Purchases\RecurringBills@duplicate')->name('recurring-bills.duplicate'); Route::get('recurring-bills/{recurring_bill}/end', 'Purchases\RecurringBills@end')->name('recurring-bills.end'); Route::post('recurring-bills/import', 'Purchases\RecurringBills@import')->middleware('import')->name('recurring-bills.import'); Route::get('recurring-bills/export', 'Purchases\RecurringBills@export')->name('recurring-bills.export'); Route::resource('recurring-bills', 'Purchases\RecurringBills', ['middleware' => ['date.format', 'money', 'dropzone']]); Route::get('vendors/{vendor}/create-bill', 'Purchases\Vendors@createBill')->name('vendors.create-bill'); Route::get('vendors/{vendor}/create-expense', 'Purchases\Vendors@createExpense')->name('vendors.create-expense'); Route::get('vendors/{vendor}/enable', 'Purchases\Vendors@enable')->name('vendors.enable'); Route::get('vendors/{vendor}/disable', 'Purchases\Vendors@disable')->name('vendors.disable'); Route::get('vendors/{vendor}/duplicate', 'Purchases\Vendors@duplicate')->name('vendors.duplicate'); Route::post('vendors/import', 'Purchases\Vendors@import')->middleware('import')->name('vendors.import'); Route::get('vendors/export', 'Purchases\Vendors@export')->name('vendors.export'); Route::resource('vendors', 'Purchases\Vendors', ['middleware' => ['dropzone']]); }); Route::group(['prefix' => 'banking'], function () { Route::group(['as' => 'marketing-account-bills.', 'prefix' => 'marketing-account-bills'], function () { Route::get('stores', 'Banking\MarketingAccountBills@storeIndex')->name('stores.index'); Route::get('{platform}/template', 'Banking\MarketingAccountBills@template')->name('template'); Route::get('{platform}/export', 'Banking\MarketingAccountBills@export')->name('export'); Route::post('{platform}/import', 'Banking\MarketingAccountBills@import')->name('import'); Route::get('{platform}/create', 'Banking\MarketingAccountBills@create')->name('create'); Route::post('{platform}', 'Banking\MarketingAccountBills@store')->name('store'); Route::get('{platform}/{marketingAccountBill}/edit', 'Banking\MarketingAccountBills@edit')->name('edit'); Route::patch('{platform}/{marketingAccountBill}', 'Banking\MarketingAccountBills@update')->name('update'); Route::delete('{platform}/{marketingAccountBill}', 'Banking\MarketingAccountBills@destroy')->name('destroy'); Route::get('{platform}', 'Banking\MarketingAccountBills@platformIndex')->name('platform.index'); }); Route::group(['as' => 'marketing-taobao-alipay-bills.', 'prefix' => 'marketing-taobao-alipay-bills'], function () { Route::get('template', 'Banking\MarketingTaobaoAlipayBills@template')->name('template'); Route::get('export', 'Banking\MarketingTaobaoAlipayBills@export')->name('export'); Route::post('import', 'Banking\MarketingTaobaoAlipayBills@import')->name('import'); Route::get('create', 'Banking\MarketingTaobaoAlipayBills@create')->name('create'); Route::post('/', 'Banking\MarketingTaobaoAlipayBills@store')->name('store'); Route::get('{marketingTaobaoAlipayBill}/edit', 'Banking\MarketingTaobaoAlipayBills@edit')->name('edit'); Route::patch('{marketingTaobaoAlipayBill}', 'Banking\MarketingTaobaoAlipayBills@update')->name('update'); Route::delete('{marketingTaobaoAlipayBill}', 'Banking\MarketingTaobaoAlipayBills@destroy')->name('destroy'); Route::get('/', 'Banking\MarketingTaobaoAlipayBills@index')->name('index'); }); Route::group(['as' => 'marketing-pinduoduo-bills.', 'prefix' => 'marketing-pinduoduo-bills'], function () { Route::get('template', 'Banking\MarketingPinduoduoBills@template')->name('template'); Route::get('export', 'Banking\MarketingPinduoduoBills@export')->name('export'); Route::post('import', 'Banking\MarketingPinduoduoBills@import')->name('import'); Route::get('create', 'Banking\MarketingPinduoduoBills@create')->name('create'); Route::post('/', 'Banking\MarketingPinduoduoBills@store')->name('store'); Route::get('{marketingPinduoduoBill}/edit', 'Banking\MarketingPinduoduoBills@edit')->name('edit'); Route::patch('{marketingPinduoduoBill}', 'Banking\MarketingPinduoduoBills@update')->name('update'); Route::delete('{marketingPinduoduoBill}', 'Banking\MarketingPinduoduoBills@destroy')->name('destroy'); Route::get('/', 'Banking\MarketingPinduoduoBills@index')->name('index'); }); Route::group(['as' => 'fund-accounts.', 'prefix' => 'fund-accounts'], function () { Route::get('bank', 'Banking\FundAccounts@bankIndex')->name('bank.index'); Route::get('stores', 'Banking\FundAccounts@storeIndex')->name('stores.index'); Route::get('{platform}/template', 'Banking\FundAccounts@template')->name('template'); Route::get('{platform}/export', 'Banking\FundAccounts@export')->name('export'); Route::post('{platform}/import', 'Banking\FundAccounts@import')->name('import'); Route::get('{platform}/create', 'Banking\FundAccounts@create')->name('create'); Route::post('{platform}', 'Banking\FundAccounts@store')->name('store'); Route::get('{platform}/{fundAccount}/edit', 'Banking\FundAccounts@edit')->name('edit'); Route::patch('{platform}/{fundAccount}', 'Banking\FundAccounts@update')->name('update'); Route::delete('{platform}/{fundAccount}', 'Banking\FundAccounts@destroy')->name('destroy'); Route::get('{platform}', 'Banking\FundAccounts@platformIndex')->name('platform.index'); }); Route::get('accounts/currency', 'Banking\Accounts@currency')->name('accounts.currency'); Route::get('accounts/{account}/create-income', 'Banking\Accounts@createIncome')->name('accounts.create-income'); Route::get('accounts/{account}/create-expense', 'Banking\Accounts@createExpense')->name('accounts.create-expense'); Route::get('accounts/{account}/create-transfer', 'Banking\Accounts@createTransfer')->name('accounts.create-transfer'); Route::get('accounts/{account}/see-performance', 'Banking\Accounts@seePerformance')->name('accounts.see-performance'); Route::get('accounts/{account}/enable', 'Banking\Accounts@enable')->name('accounts.enable'); Route::get('accounts/{account}/disable', 'Banking\Accounts@disable')->name('accounts.disable'); Route::get('accounts/{account}/duplicate', 'Banking\Accounts@duplicate')->name('accounts.duplicate'); Route::resource('accounts', 'Banking\Accounts', ['middleware' => ['date.format', 'money']]); Route::post('transactions/import', 'Banking\Transactions@import')->name('transactions.import'); Route::get('transactions/export', 'Banking\Transactions@export')->name('transactions.export'); Route::get('transactions/{transaction}/email', 'Banking\Transactions@emailTransaction')->name('transactions.email'); Route::get('transactions/{transaction}/print', 'Banking\Transactions@printTransaction')->name('transactions.print'); Route::get('transactions/{transaction}/pdf', 'Banking\Transactions@pdfTransaction')->name('transactions.pdf'); Route::get('transactions/{transaction}/duplicate', 'Banking\Transactions@duplicate')->name('transactions.duplicate'); Route::get('transactions/{transaction}/dial', 'Banking\Transactions@dial')->name('transactions.dial'); Route::post('transactions/{transaction}/connect', 'Banking\Transactions@connect')->name('transactions.connect'); Route::post('transactions/import', 'Banking\Transactions@import')->middleware('import')->name('transactions.import'); Route::get('transactions/export', 'Banking\Transactions@export')->name('transactions.export'); Route::resource('transactions', 'Banking\Transactions', ['middleware' => ['date.format', 'money', 'dropzone']]); Route::get('recurring-transactions/{recurring_transaction}/duplicate', 'Banking\RecurringTransactions@duplicate')->name('recurring-transactions.duplicate'); Route::get('recurring-transactions/{recurring_transaction}/end', 'Banking\RecurringTransactions@end')->name('recurring-transactions.end'); Route::post('recurring-transactions/import', 'Banking\RecurringTransactions@import')->middleware('import')->name('recurring-transactions.import'); Route::get('recurring-transactions/export', 'Banking\RecurringTransactions@export')->name('recurring-transactions.export'); Route::resource('recurring-transactions', 'Banking\RecurringTransactions', ['middleware' => ['date.format', 'money', 'dropzone']]); Route::get('transfers/{transfer}/print', 'Banking\Transfers@printTransfer')->name('transfers.print'); Route::get('transfers/{transfer}/pdf', 'Banking\Transfers@pdfTransfer')->name('transfers.pdf'); Route::get('transfers/{transfer}/duplicate', 'Banking\Transfers@duplicate')->name('transfers.duplicate'); Route::post('transfers/import', 'Banking\Transfers@import')->middleware('import')->name('transfers.import'); Route::get('transfers/export', 'Banking\Transfers@export')->name('transfers.export'); Route::resource('transfers', 'Banking\Transfers', ['middleware' => ['date.format', 'money', 'dropzone']]); Route::post('reconciliations/calculate', 'Banking\Reconciliations@calculate')->middleware(['money']); Route::patch('reconciliations/calculate', 'Banking\Reconciliations@calculate')->middleware(['money']); Route::resource('reconciliations', 'Banking\Reconciliations', ['middleware' => ['date.format', 'money', 'dropzone']]); }); Route::group(['as' => 'zhongcai-reconciliations.', 'prefix' => 'zhongcai-reconciliations'], function () { Route::get('template', 'StoreReceivables\StoreZhongcaiReconciliations@template')->name('template'); Route::get('export', 'StoreReceivables\StoreZhongcaiReconciliations@export')->name('export'); Route::post('import', 'StoreReceivables\StoreZhongcaiReconciliations@import')->name('import'); Route::get('create', 'StoreReceivables\StoreZhongcaiReconciliations@create')->name('create'); Route::post('/', 'StoreReceivables\StoreZhongcaiReconciliations@store')->name('store'); Route::get('{zhongcaiReconciliation}/edit', 'StoreReceivables\StoreZhongcaiReconciliations@edit')->name('edit'); Route::patch('{zhongcaiReconciliation}', 'StoreReceivables\StoreZhongcaiReconciliations@update')->name('update'); Route::delete('{zhongcaiReconciliation}', 'StoreReceivables\StoreZhongcaiReconciliations@destroy')->name('destroy'); Route::get('/', 'StoreReceivables\StoreZhongcaiReconciliations@index')->name('index'); }); Route::group(['prefix' => 'settings'], function () { Route::get('categories/{category}/enable', 'Settings\Categories@enable')->name('categories.enable'); Route::get('categories/{category}/disable', 'Settings\Categories@disable')->name('categories.disable'); Route::post('categories/import', 'Settings\Categories@import')->middleware('import')->name('categories.import'); Route::get('categories/export', 'Settings\Categories@export')->name('categories.export'); Route::resource('categories', 'Settings\Categories'); Route::get('currencies/config', 'Settings\Currencies@config')->name('currencies.config'); Route::get('currencies/{currency}/enable', 'Settings\Currencies@enable')->name('currencies.enable'); Route::get('currencies/{currency}/disable', 'Settings\Currencies@disable')->name('currencies.disable'); Route::resource('currencies', 'Settings\Currencies'); Route::get('taxes/{tax}/enable', 'Settings\Taxes@enable')->name('taxes.enable'); Route::get('taxes/{tax}/disable', 'Settings\Taxes@disable')->name('taxes.disable'); Route::post('taxes/import', 'Settings\Taxes@import')->middleware('import')->name('taxes.import'); Route::get('taxes/export', 'Settings\Taxes@export')->name('taxes.export'); Route::resource('taxes', 'Settings\Taxes'); Route::group(['as' => 'settings.'], function () { Route::get('navigation', 'Settings\Navigation@manage')->name('navigation.manage'); Route::patch('navigation', 'Settings\Navigation@save')->name('navigation.save'); Route::get('company', 'Settings\Company@edit')->name('company.edit'); Route::patch('company', 'Settings\Company@update')->middleware('dropzone')->name('company.update'); Route::get('localisation', 'Settings\Localisation@edit')->name('localisation.edit'); Route::patch('localisation', 'Settings\Localisation@update')->name('localisation.update'); Route::get('invoice', 'Settings\Invoice@edit')->name('invoice.edit'); Route::patch('invoice', 'Settings\Invoice@update')->name('invoice.update'); Route::get('default', 'Settings\Defaults@edit')->name('default.edit'); Route::patch('default', 'Settings\Defaults@update')->name('default.update'); Route::get('email', 'Settings\Email@edit')->name('email.edit'); Route::patch('email', 'Settings\Email@update')->name('email.update'); Route::get('email-templates', 'Settings\EmailTemplates@edit')->name('email-templates.edit'); Route::patch('email-templates', 'Settings\EmailTemplates@update')->name('email-templates.update'); Route::get('email-templates/get', 'Settings\EmailTemplates@get')->name('email-templates.get'); Route::get('schedule', 'Settings\Schedule@edit')->name('schedule.edit'); Route::patch('schedule', 'Settings\Schedule@update')->name('schedule.update'); }); }); Route::group(['as' => 'settings.'], function () { Route::get('{alias}/settings', 'Settings\Modules@edit')->name('module.edit'); Route::patch('{alias}/settings', 'Settings\Modules@update')->middleware('dropzone')->name('module.update'); }); Route::group(['as' => 'apps.', 'prefix' => 'apps'], function () { Route::resource('api-key', 'Modules\ApiKey'); Route::group(['middleware' => 'api.key'], function () { Route::resource('home', 'Modules\Home'); Route::resource('my', 'Modules\My'); Route::get('categories/{alias}', 'Modules\Tiles@categoryModules')->name('categories.show'); Route::get('vendors/{alias}', 'Modules\Tiles@vendorModules')->name('vendors.show'); Route::get('docs/{alias}', 'Modules\Item@documentation')->name('docs.show'); Route::get('paid', 'Modules\Tiles@paidModules')->name('paid'); Route::get('new', 'Modules\Tiles@newModules')->name('new'); Route::get('free', 'Modules\Tiles@freeModules')->name('free'); Route::get('search', 'Modules\Tiles@searchModules')->name('search'); Route::post('{type}/load-more', 'Modules\Tiles@loadMore')->name('load-more'); Route::post('steps', 'Modules\Item@steps')->name('steps'); Route::post('download', 'Modules\Item@download')->name('download'); Route::post('unzip', 'Modules\Item@unzip')->name('unzip'); Route::post('copy', 'Modules\Item@copy')->name('copy'); Route::post('install', 'Modules\Item@install')->name('install'); Route::post('{alias}/releases', 'Modules\Item@releases')->name('app.releases'); Route::post('{alias}/reviews', 'Modules\Item@reviews')->name('app.reviews'); Route::get('{alias}/uninstall', 'Modules\Item@uninstall')->name('app.uninstall'); Route::get('{alias}/enable', 'Modules\Item@enable')->name('app.enable'); Route::get('{alias}/disable', 'Modules\Item@disable')->name('app.disable'); Route::get('{alias}', 'Modules\Item@show')->name('app.show'); }); }); Route::group(['prefix' => 'install'], function () { Route::get('updates', 'Install\Updates@index')->name('updates.index'); Route::get('updates/changelog', 'Install\Updates@changelog')->name('updates.changelog'); Route::get('updates/check', 'Install\Updates@check')->name('updates.check'); Route::get('updates/run/{alias}/{version}', 'Install\Updates@run')->name('updates.run'); Route::post('updates/steps', 'Install\Updates@steps')->name('updates.steps'); Route::post('updates/download', 'Install\Updates@download')->middleware('api.key')->name('updates.download'); Route::post('updates/unzip', 'Install\Updates@unzip')->middleware('api.key')->name('updates.unzip'); Route::post('updates/copy-files', 'Install\Updates@copyFiles')->middleware('api.key')->name('updates.copy'); Route::post('updates/migrate', 'Install\Updates@migrate')->name('updates.migrate'); Route::post('updates/finish', 'Install\Updates@finish')->name('updates.finish'); Route::post('updates/redirect', 'Install\Updates@redirect')->name('updates.redirect'); }); Route::group(['as' => 'modals.', 'prefix' => 'modals'], function () { Route::resource('accounts', 'Modals\Accounts'); Route::resource('categories', 'Modals\Categories'); Route::resource('currencies', 'Modals\Currencies'); Route::resource('customers', 'Modals\Customers'); Route::resource('companies', 'Modals\Companies'); Route::resource('vendors', 'Modals\Vendors'); Route::resource('items', 'Modals\Items'); Route::patch('invoice-templates', 'Modals\InvoiceTemplates@update')->name('invoice-templates.update'); Route::patch('transfer-templates', 'Modals\TransferTemplates@update')->name('transfer-templates.update'); Route::get('documents/item-columns/edit', 'Modals\DocumentItemColumns@edit')->name('documents.item-columns.edit'); Route::patch('documents/item-columns', 'Modals\DocumentItemColumns@update')->name('documents.item-columns.update'); Route::resource('documents/{document}/transactions', 'Modals\DocumentTransactions', [ 'names' => 'documents.document.transactions', 'middleware' => ['date.format', 'money', 'dropzone'] ]); Route::get('invoices/{invoice}/emails/create', 'Modals\InvoiceEmails@create')->name('invoices.emails.create'); Route::post('invoices/{invoice}/emails', 'Modals\InvoiceEmails@store')->name('invoices.emails.store'); Route::get('invoices/{invoice}/share/create', 'Modals\InvoiceShare@create')->name('invoices.share.create'); Route::get('transactions/{transaction}/emails/create', 'Modals\TransactionEmails@create')->name('transactions.emails.create'); Route::post('transactions/{transaction}/emails', 'Modals\TransactionEmails@store')->name('transactions.emails.store'); Route::get('transactions/{transaction}/share/create', 'Modals\TransactionShare@create')->name('transactions.share.create'); Route::resource('taxes', 'Modals\Taxes'); });