CaiWuXiTong/routes/admin.php

1029 lines
71 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use App\Http\Controllers\Business\AccountMappingActions;
use App\Http\Controllers\Business\CourierProfiles;
use App\Http\Controllers\Business\CourierQuoteChanges;
use App\Http\Controllers\Business\CourierStockQuoteEntries;
use App\Http\Controllers\Business\CourierQuoteSignatures;
use App\Http\Controllers\Business\CourierAgreementSignatures;
use App\Http\Controllers\Business\CourierOnboardings;
use App\Http\Controllers\Business\CourierPayableSummaries;
use App\Http\Controllers\Business\CourierSurchargeQuotes;
use App\Http\Controllers\Business\CourierSurchargeTypes;
use App\Http\Controllers\Business\ProductPrices;
use App\Http\Controllers\Business\SupplierPayableActions;
use App\Http\Controllers\Business\PayablesFinalActions;
use App\Http\Controllers\Business\SupplierReconciliation as SupplierReconciliationActions;
use App\Http\Controllers\Business\WithdrawalManagement;
use Illuminate\Support\Facades\Route;
use Modules\EcommerceFinance\Http\Controllers\AccountBills;
use Modules\EcommerceFinance\Http\Controllers\AlipayBills;
use Modules\EcommerceFinance\Http\Controllers\DewuAccountBills;
use Modules\EcommerceFinance\Http\Controllers\PinduoduoAccountBills;
use Modules\EcommerceFinance\Http\Controllers\TaobaoWechatAccountBills;
use Modules\EcommerceFinance\Http\Controllers\Api\GoodsReconciliations;
use Modules\EcommerceFinance\Http\Controllers\Api\SupplierPayables;
use Modules\EcommerceFinance\Http\Controllers\ThirdPartyWarehouseStorageSettlementExportController;
Route::post('store-account-passwords/visible-page/reveal', 'Business\StoreAccountPasswords@revealVisiblePage')
->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}', [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::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/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/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-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::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::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/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');
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/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/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::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::post('workspace/financial-ledger/mapping/{id}', [\App\Http\Controllers\Business\FinanceLedger::class, 'updateMapping'])
->whereNumber('id')
->middleware('business.page:financial-ledger,ledger')
->name('business.financial-ledger.mapping.update');
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');
});