web.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. <?php
  2. use App\Http\Controllers\Admin\AdminAreaController;
  3. use App\Http\Controllers\Admin\AdminDistrictController;
  4. use App\Http\Controllers\Admin\AdminNotificationLogController;
  5. use App\Http\Controllers\Admin\AdminSettingsController;
  6. use App\Http\Controllers\Admin\RoleController;
  7. use App\Http\Controllers\AreaController;
  8. use App\Http\Controllers\ChatMessageController;
  9. use App\Http\Controllers\ClearDataController;
  10. use App\Http\Controllers\CommonCatalogController;
  11. use App\Http\Controllers\ContractController;
  12. use App\Http\Controllers\ContractorController;
  13. use App\Http\Controllers\DocumentationController;
  14. use App\Http\Controllers\FilterController;
  15. use App\Http\Controllers\ImportController;
  16. use App\Http\Controllers\MafOrderController;
  17. use App\Http\Controllers\OrderController;
  18. use App\Http\Controllers\PricingCodeController;
  19. use App\Http\Controllers\ProductController;
  20. use App\Http\Controllers\ProductSKUController;
  21. use App\Http\Controllers\ReclamationController;
  22. use App\Http\Controllers\ReportController;
  23. use App\Http\Controllers\ResponsibleController;
  24. use App\Http\Controllers\ScheduleController;
  25. use App\Http\Controllers\SparePartController;
  26. use App\Http\Controllers\SparePartInventoryController;
  27. use App\Http\Controllers\SparePartOrderController;
  28. use App\Http\Controllers\SparePartReservationController;
  29. use App\Http\Controllers\StockController;
  30. use App\Http\Controllers\StockOrderController;
  31. use App\Http\Controllers\UnderDevelopmentController;
  32. use App\Http\Controllers\UserController;
  33. use App\Http\Controllers\UserNotificationController;
  34. use App\Http\Controllers\YearDataController;
  35. use Illuminate\Http\Request;
  36. use Illuminate\Support\Facades\Auth;
  37. use Illuminate\Support\Facades\Route;
  38. Route::get('/', function () {
  39. return redirect()->route('home');
  40. });
  41. Auth::routes(['register' => false, 'reset' => false, 'verify' => false, 'confirm' => false]);
  42. Route::post('keep-token-alive', function () {
  43. return 'Session extended.';
  44. });
  45. Route::get('/home', function () {
  46. return redirect()->route('order.index');
  47. })->name('home');
  48. Route::middleware(['auth:web', 'route.permission'])->group(function () {
  49. // set current year for display
  50. Route::get('set-year', function (Request $request) {
  51. if ($request->has('year')) {
  52. session(['year' => $request->year]);
  53. }
  54. $targetUrl = session('last_web_url');
  55. $currentUrl = $request->fullUrl();
  56. $targetHost = parse_url((string) $targetUrl, PHP_URL_HOST);
  57. $currentHost = $request->getHost();
  58. if (! empty($targetUrl) && $targetUrl !== $currentUrl && (! $targetHost || $targetHost === $currentHost)) {
  59. return redirect()->to($targetUrl);
  60. }
  61. return redirect()->route('order.index');
  62. })->name('set-year');
  63. // admin routes
  64. Route::prefix('admin')->group(function () {
  65. Route::prefix('users')->group(function () {
  66. Route::get('', [UserController::class, 'index'])->name('user.index');
  67. Route::get('create', [UserController::class, 'create'])->name('user.create');
  68. Route::get('{user}', [UserController::class, 'show'])->name('user.show');
  69. Route::post('', [UserController::class, 'store'])->name('user.store');
  70. Route::post('{user}/impersonate', [UserController::class, 'impersonate'])->name('user.impersonate');
  71. // Route::put('{user}', [UserController::class, 'update'])->name('user.update');
  72. Route::delete('{user}', [UserController::class, 'destroy'])->name('user.destroy');
  73. Route::post('undelete/{user}', [UserController::class, 'undelete'])->name('user.undelete');
  74. });
  75. Route::prefix('roles')->name('admin.roles.')->group(function () {
  76. Route::get('', [RoleController::class, 'index'])->name('index');
  77. Route::get('create', [RoleController::class, 'create'])->name('create');
  78. Route::post('', [RoleController::class, 'store'])->name('store');
  79. Route::post('from-user/{user}', [RoleController::class, 'storeFromUser'])->name('store-from-user');
  80. Route::post('{role}/copy', [RoleController::class, 'copy'])->name('copy');
  81. Route::get('{role}', [RoleController::class, 'edit'])->name('edit');
  82. Route::put('{role}', [RoleController::class, 'update'])->name('update');
  83. Route::delete('{role}', [RoleController::class, 'destroy'])->name('destroy');
  84. });
  85. Route::prefix('import')->group(function () {
  86. Route::get('', [ImportController::class, 'index'])->name('import.index');
  87. Route::get('{import}', [ImportController::class, 'show'])->name('import.show');
  88. Route::post('', [ImportController::class, 'store'])->name('import.create');
  89. });
  90. Route::prefix('clear-data')->group(function () {
  91. Route::get('', [ClearDataController::class, 'index'])->name('clear-data.index');
  92. Route::get('stats', [ClearDataController::class, 'stats'])->name('clear-data.stats');
  93. Route::delete('', [ClearDataController::class, 'destroy'])->name('clear-data.destroy');
  94. });
  95. Route::prefix('year-data')->group(function () {
  96. Route::get('', [YearDataController::class, 'index'])->name('year-data.index');
  97. Route::get('stats', [YearDataController::class, 'stats'])->name('year-data.stats');
  98. Route::post('export', [YearDataController::class, 'export'])->name('year-data.export');
  99. Route::post('import', [YearDataController::class, 'import'])->name('year-data.import');
  100. Route::get('download/{file}', [YearDataController::class, 'download'])->name('year-data.download');
  101. });
  102. Route::prefix('settings')->group(function () {
  103. Route::get('', [AdminSettingsController::class, 'index'])->name('admin.settings.index');
  104. Route::post('', [AdminSettingsController::class, 'store'])->name('admin.settings.store');
  105. });
  106. Route::get('notifications/log', [AdminNotificationLogController::class, 'index'])->name('admin.notifications.log');
  107. // Справочник округов
  108. Route::prefix('districts')->group(function () {
  109. Route::get('', [AdminDistrictController::class, 'index'])->name('admin.district.index');
  110. Route::post('', [AdminDistrictController::class, 'store'])->name('admin.district.store');
  111. Route::post('export', [AdminDistrictController::class, 'export'])->name('admin.district.export');
  112. Route::post('import', [AdminDistrictController::class, 'import'])->name('admin.district.import');
  113. Route::get('{district}', [AdminDistrictController::class, 'show'])->name('admin.district.show');
  114. Route::delete('{district}', [AdminDistrictController::class, 'destroy'])->name('admin.district.destroy');
  115. Route::post('undelete/{district}', [AdminDistrictController::class, 'undelete'])->name('admin.district.undelete');
  116. });
  117. // Справочник районов
  118. Route::prefix('areas-dict')->group(function () {
  119. Route::get('', [AdminAreaController::class, 'index'])->name('admin.area.index');
  120. Route::post('', [AdminAreaController::class, 'store'])->name('admin.area.store');
  121. Route::post('export', [AdminAreaController::class, 'export'])->name('admin.area.export');
  122. Route::post('import', [AdminAreaController::class, 'import'])->name('admin.area.import');
  123. Route::get('{area}', [AdminAreaController::class, 'show'])->name('admin.area.show');
  124. Route::delete('{area}', [AdminAreaController::class, 'destroy'])->name('admin.area.destroy');
  125. Route::post('undelete/{area}', [AdminAreaController::class, 'undelete'])->name('admin.area.undelete');
  126. });
  127. });
  128. // profile
  129. Route::get('profile', [UserController::class, 'profile'])->name('user.profile');
  130. Route::post('profile/store', [UserController::class, 'storeProfile'])->name('profile.store');
  131. Route::delete('profile', [UserController::class, 'deleteProfile'])->name('profile.delete');
  132. Route::post('impersonate/leave', [UserController::class, 'leaveImpersonation'])->name('user.impersonate.leave');
  133. Route::get('notifications', [UserNotificationController::class, 'index'])->name('notifications.index');
  134. Route::post('notifications/read-all', [UserNotificationController::class, 'markAllRead'])->name('notifications.read-all');
  135. Route::post('notifications/{notification}/read', [UserNotificationController::class, 'markRead'])->name('notifications.read');
  136. Route::get('notifications/unread/count', [UserNotificationController::class, 'unreadCount'])->name('notifications.unread-count');
  137. Route::get('get-filters', [FilterController::class, 'getFilters'])->name('getFilters');
  138. Route::prefix('common-catalog')->name('common-catalog.')->group(function () {
  139. Route::get('', [CommonCatalogController::class, 'index'])->name('index');
  140. Route::get('create', [CommonCatalogController::class, 'create'])->name('create');
  141. Route::post('', [CommonCatalogController::class, 'store'])->name('store');
  142. Route::post('import', [CommonCatalogController::class, 'import'])->name('import');
  143. Route::post('export', [CommonCatalogController::class, 'export'])->name('export');
  144. Route::get('{commonCatalogItem}', [CommonCatalogController::class, 'show'])->name('show');
  145. Route::put('{commonCatalogItem}', [CommonCatalogController::class, 'update'])->name('update');
  146. Route::delete('{commonCatalogItem}', [CommonCatalogController::class, 'destroy'])->name('destroy');
  147. Route::post('{commonCatalogItem}/image', [CommonCatalogController::class, 'uploadImage'])->name('image.upload');
  148. Route::delete('{commonCatalogItem}/image', [CommonCatalogController::class, 'deleteImage'])->name('image.delete');
  149. Route::post('{commonCatalogItem}/documents', [CommonCatalogController::class, 'uploadDocument'])->name('documents.upload');
  150. Route::delete('{commonCatalogItem}/documents/{file}', [CommonCatalogController::class, 'deleteDocument'])->name('documents.delete');
  151. });
  152. Route::prefix('schedules')->name('schedule.')->group(function () {
  153. Route::get('orders', UnderDevelopmentController::class)
  154. ->defaults('title', 'График заказов')
  155. ->defaults('active', 'schedule_orders')
  156. ->name('orders');
  157. Route::get('deliveries', UnderDevelopmentController::class)
  158. ->defaults('title', 'График доставок')
  159. ->defaults('active', 'schedule_deliveries')
  160. ->name('deliveries');
  161. });
  162. Route::prefix('stock')->name('stock.')->group(function () {
  163. Route::get('', [StockController::class, 'index'])->name('index');
  164. Route::get('items/{item}', [StockController::class, 'show'])->name('show');
  165. Route::post('items/{item}/reservations', [StockController::class, 'reserve'])->name('reserve');
  166. Route::post('reservations/{reservation}/issue', [StockController::class, 'issue'])->name('reservations.issue');
  167. Route::post('reservations/{reservation}/cancel', [StockController::class, 'cancel'])->name('reservations.cancel');
  168. Route::get('orders', [StockOrderController::class, 'index'])->name('orders');
  169. Route::post('orders', [StockOrderController::class, 'store'])->name('orders.store');
  170. Route::post('orders/set-in-stock', [StockOrderController::class, 'setOrderInStock'])->name('orders.set-in-stock');
  171. Route::post('orders/import', [StockOrderController::class, 'import'])->name('orders.import');
  172. Route::put('orders/{stockOrder}', [StockOrderController::class, 'update'])->name('orders.update');
  173. Route::delete('orders/{stockOrder}', [StockOrderController::class, 'destroy'])->name('orders.destroy');
  174. });
  175. Route::prefix('documents')->name('documents.')->group(function () {
  176. Route::get('', [DocumentationController::class, 'index'])->name('index');
  177. Route::post('folders', [DocumentationController::class, 'storeFolder'])->name('folders.store');
  178. Route::put('folders/{folder}', [DocumentationController::class, 'updateFolder'])->name('folders.update');
  179. Route::delete('folders/{folder}', [DocumentationController::class, 'destroyFolder'])->name('folders.destroy');
  180. Route::put('folders/{folder}/permissions', [DocumentationController::class, 'updatePermissions'])->name('folders.permissions.update');
  181. Route::post('folders/{folder}/documents', [DocumentationController::class, 'storeDocument'])->name('store');
  182. Route::put('{document}', [DocumentationController::class, 'updateDocument'])->name('update');
  183. Route::delete('{document}', [DocumentationController::class, 'destroyDocument'])->name('destroy');
  184. Route::post('{document}/versions', [DocumentationController::class, 'storeVersion'])->name('versions.store');
  185. Route::get('versions/{version}/preview', [DocumentationController::class, 'previewVersion'])->name('versions.preview');
  186. Route::get('versions/{version}/download', [DocumentationController::class, 'downloadVersion'])->name('versions.download');
  187. Route::delete('versions/{version}', [DocumentationController::class, 'destroyVersion'])->name('versions.destroy');
  188. });
  189. Route::get('calculations', UnderDevelopmentController::class)
  190. ->defaults('title', 'Калькуляции')
  191. ->defaults('active', 'calculations')
  192. ->name('calculations.index');
  193. Route::group([], function () {
  194. Route::prefix('responsibles')->group(function () {
  195. Route::get('', [ResponsibleController::class, 'index'])->name('responsible.index');
  196. Route::get('{responsible}', [ResponsibleController::class, 'show'])->name('responsible.show');
  197. Route::post('store', [ResponsibleController::class, 'store'])->name('responsible.store');
  198. Route::post('update/{responsible}', [ResponsibleController::class, 'update'])->name('responsible.update');
  199. Route::delete('delete/{responsible}', [ResponsibleController::class, 'destroy'])->name('responsible.destroy');
  200. });
  201. // catalog
  202. Route::get('catalog', [ProductController::class, 'index'])->name('catalog.index');
  203. Route::get('catalog/{product}', [ProductController::class, 'show'])->name('catalog.show')->where('product', '[0-9]+');
  204. // contracts
  205. Route::get('contract', [ContractController::class, 'index'])->name('contract.index');
  206. Route::get('contract/create', [ContractController::class, 'create'])->name('contract.create');
  207. Route::get('contract/{contract}', [ContractController::class, 'show'])->name('contract.show');
  208. Route::post('contract', [ContractController::class, 'store'])->name('contract.store');
  209. Route::post('contract/{contract}', [ContractController::class, 'update'])->name('contract.update');
  210. Route::delete('contract/{contract}', [ContractController::class, 'delete'])->name('contract.delete');
  211. // contractors
  212. Route::prefix('contractors')->name('contractors.')->group(function () {
  213. Route::get('', [ContractorController::class, 'index'])->name('index');
  214. Route::get('create', [ContractorController::class, 'create'])->name('create');
  215. Route::post('', [ContractorController::class, 'store'])->name('store');
  216. Route::get('{contractor}', [ContractorController::class, 'show'])->name('show');
  217. Route::post('{contractor}', [ContractorController::class, 'update'])->name('update');
  218. Route::post('{contractor}/prices', [ContractorController::class, 'updatePrice'])->name('prices.update');
  219. Route::post('{contractor}/prices/import', [ContractorController::class, 'importPrices'])->name('prices.import');
  220. Route::post('{contractor}/prices/export', [ContractorController::class, 'exportPrices'])->name('prices.export');
  221. });
  222. // orders
  223. Route::get('order/edit/{order}', [OrderController::class, 'edit'])->name('order.edit');
  224. Route::post('order/store', [OrderController::class, 'store'])->name('order.store');
  225. Route::post('order/update', [OrderController::class, 'store'])->name('order.update');
  226. Route::delete('order/delete/{order}', [OrderController::class, 'destroy'])->name('order.destroy');
  227. Route::post('order/{order}/upload-document', [OrderController::class, 'uploadDocument'])->name('order.upload-document');
  228. Route::post('order/{order}/upload-statement', [OrderController::class, 'uploadStatement'])->name('order.upload-statement');
  229. Route::delete('order/delete-photo/{order}/{file}', [OrderController::class, 'deletePhoto'])->name('order.delete-photo');
  230. Route::delete('order/delete-document/{order}/{file}', [OrderController::class, 'deleteDocument'])->name('order.delete-document');
  231. Route::delete('order/delete-statement/{order}/{file}', [OrderController::class, 'deleteStatement'])->name('order.delete-statement');
  232. Route::post('catalog/{product}/upload-certificate', [ProductController::class, 'uploadCertificate'])->name('catalog.upload-certificate');
  233. Route::post('catalog/{product}/upload-thumbnail', [ProductController::class, 'uploadThumbnail'])->name('catalog.upload-thumbnail');
  234. Route::post('product_sku/{product_sku}/upload-passport', [ProductSKUController::class, 'uploadPassport'])->name('product-sku.upload-passport');
  235. Route::get('order/generate-installation-pack/{order}', [OrderController::class, 'generateInstallationPack'])->name('order.generate-installation-pack');
  236. Route::get('order/generate-handover-pack/{order}', [OrderController::class, 'generateHandoverPack'])->name('order.generate-handover-pack');
  237. Route::get('reclamation/generate-reclamation-pack/{reclamation}', [ReclamationController::class, 'generateReclamationPack'])->name('order.generate-reclamation-pack');
  238. Route::get('reclamation/generate-reclamation-payment-pack/{reclamation}', [ReclamationController::class, 'generateReclamationPaymentPack'])->name('reclamation.generate-reclamation-payment-pack');
  239. Route::get('reclamation/generate-photos-before-pack/{reclamation}', [ReclamationController::class, 'generatePhotosBeforePack'])->name('reclamation.generate-photos-before-pack');
  240. Route::get('reclamation/generate-photos-after-pack/{reclamation}', [ReclamationController::class, 'generatePhotosAfterPack'])->name('reclamation.generate-photos-after-pack');
  241. // Склад (МАФ)
  242. Route::get('product_sku', [ProductSKUController::class, 'index'])->name('product_sku.index');
  243. Route::post('product_sku/{product_sku}/inline-update', [ProductSKUController::class, 'inlineUpdate'])
  244. ->name('product_sku.inline-update');
  245. Route::get('product_sku/{product_sku}', [ProductSKUController::class, 'show'])->name('product_sku.show');
  246. Route::post('product_sku/update/{product_sku}', [ProductSKUController::class, 'update'])->name('product_sku.update');
  247. // рекламации
  248. Route::post('reclamations/create/{order}', [ReclamationController::class, 'create'])->name('reclamations.create');
  249. Route::post('reclamations/update/{reclamation}', [ReclamationController::class, 'update'])->name('reclamations.update');
  250. Route::post('reclamations/{reclamation}/update-status', [ReclamationController::class, 'updateStatus'])->name('reclamations.update-status');
  251. Route::post('reclamations/{reclamation}/upload-document', [ReclamationController::class, 'uploadDocument'])->name('reclamations.upload-document');
  252. Route::delete('reclamations/delete-document/{reclamation}/{file}', [ReclamationController::class, 'deleteDocument'])
  253. ->name('reclamations.delete-document');
  254. Route::delete('reclamations/delete-photo-before/{reclamation}/{file}', [ReclamationController::class, 'deletePhotoBefore'])->name('reclamations.delete-photo-before');
  255. Route::delete('reclamations/delete-photo-after/{reclamation}/{file}', [ReclamationController::class, 'deletePhotoAfter'])->name('reclamations.delete-photo-after');
  256. Route::post('reclamations/{reclamation}/update-details', [ReclamationController::class, 'updateDetails'])->name('reclamations.update-details');
  257. Route::post('reclamations/{reclamation}/update-spare-parts', [ReclamationController::class, 'updateSpareParts'])->name('reclamations.update-spare-parts');
  258. Route::delete('reclamations/{reclamation}', [ReclamationController::class, 'delete'])->name('reclamations.delete');
  259. Route::get('reports', [ReportController::class, 'index'])->name('reports.index');
  260. });
  261. Route::post('mafs-registry', [ProductSKUController::class, 'exportMafRegistry'])
  262. ->name('mafs.registry');
  263. // orders for all
  264. Route::get('order', [OrderController::class, 'index'])->name('order.index');
  265. Route::get('order/show/{order}', [OrderController::class, 'show'])->name('order.show');
  266. Route::post('order/{order}/upload-photo', [OrderController::class, 'uploadPhoto'])->name('order.upload-photo');
  267. Route::post('order/{order}/chat-messages', [ChatMessageController::class, 'storeForOrder'])->name('order.chat-messages.store');
  268. Route::delete('order/{order}/chat-messages/{chatMessage}', [ChatMessageController::class, 'destroyForOrder'])
  269. ->name('order.chat-messages.delete');
  270. Route::get('order/generate-photos-pack/{order}', [OrderController::class, 'generatePhotosPack'])->name('order.generate-photos-pack');
  271. Route::get('order/download-tech-docs/{order}', [OrderController::class, 'downloadTechDocs'])->name('order.download-tech-docs');
  272. Route::post('order/{order}/contractor-specification', [OrderController::class, 'createContractorSpecification'])
  273. ->name('order.contractor-specification');
  274. Route::post('order/{order}/add-statement-to-mafs', [OrderController::class, 'addStatementToMafs'])
  275. ->name('order.add-statement-to-mafs');
  276. Route::group([], function () {
  277. Route::get('catalog/create', [ProductController::class, 'create'])->name('catalog.create');
  278. Route::post('catalog', [ProductController::class, 'store'])->name('catalog.store');
  279. Route::post('catalog/{product}', [ProductController::class, 'update'])->name('catalog.update');
  280. Route::delete('catalog/{product}', [ProductController::class, 'delete'])->name('catalog.delete');
  281. Route::post('catalog-export', [ProductController::class, 'export'])->name('catalog.export');
  282. Route::post('mafs-import', [ProductSKUController::class, 'importMaf'])->name('mafs.import');
  283. Route::post('mafs-export', [ProductSKUController::class, 'exportMaf'])->name('mafs.export');
  284. // Склад заказы МАФ
  285. Route::get('maf_orders', [MafOrderController::class, 'index'])->name('maf_order.index');
  286. Route::get('maf_orders/{maf_order}', [MafOrderController::class, 'show'])->name('maf_order.show');
  287. Route::post('maf_orders/store', [MafOrderController::class, 'store'])->name('maf_order.store');
  288. Route::post('maf_orders/update/{maf_order}', [MafOrderController::class, 'update'])->name('maf_order.update');
  289. Route::delete('maf_orders/delete/{maf_order}', [MafOrderController::class, 'destroy'])->name('maf_order.delete');
  290. Route::post('maf_orders/set_in_stock/{maf_order}', [MafOrderController::class, 'setInStock'])->name('maf_order.set_in_stock');
  291. Route::post('maf_orders/set_order_in_stock', [MafOrderController::class, 'setOrderInStock'])->name('maf_order.set_order_in_stock');
  292. // график
  293. Route::post('schedule/create_from_order', [ScheduleController::class, 'createFromOrder'])->name('schedule.create-from-order');
  294. Route::post('schedule/create_from_reclamation', [ScheduleController::class, 'createFromReclamation'])->name('schedule.create-from-reclamation');
  295. Route::post('schedule/update', [ScheduleController::class, 'update'])->name('schedule.update');
  296. Route::post('schedule/export', [ScheduleController::class, 'export'])->name('schedule.export');
  297. Route::delete('schedule/delete/{schedule}', [ScheduleController::class, 'delete'])->name('schedule.delete');
  298. Route::get('order/create', [OrderController::class, 'create'])->name('order.create');
  299. Route::post('order/export-one/{order}', [OrderController::class, 'exportOne'])->name('order.export-one');
  300. Route::get('order/{order}/get-maf', [OrderController::class, 'getMafToOrder'])->name('order.get-maf');
  301. Route::get('order/revert-maf/{order}', [OrderController::class, 'revertMaf'])->name('order.revert-maf');
  302. Route::post('order/move-maf', [OrderController::class, 'moveMaf'])->name('order.move-maf');
  303. Route::post('order/create-ttn', [OrderController::class, 'createTtn'])->name('order.create-ttn');
  304. Route::delete('order/delete-all-photos/{order}', [OrderController::class, 'deleteAllPhotos'])->name('order.delete-all-photos');
  305. Route::delete('order/delete-all-documents/{order}', [OrderController::class, 'deleteAllDocuments'])->name('order.delete-all-documents');
  306. Route::delete('order/delete-all-statements/{order}', [OrderController::class, 'deleteAllStatements'])->name('order.delete-all-statements');
  307. Route::delete('catalog/delete-certificate/{product}/{file}', [ProductController::class, 'deleteCertificate'])->name('catalog.delete-certificate');
  308. Route::delete('product_sku/delete-passport/{product_sku}/{file}', [ProductSKUController::class, 'deletePassport'])->name('product-sku.delete-passport');
  309. });
  310. Route::post('reclamations/export', [ReclamationController::class, 'export'])
  311. ->name('reclamations.export');
  312. Route::get('reclamations', [ReclamationController::class, 'index'])->name('reclamations.index');
  313. Route::get('reclamations/show/{reclamation}', [ReclamationController::class, 'show'])->name('reclamations.show');
  314. Route::post('reclamations/{reclamation}/chat-messages', [ChatMessageController::class, 'storeForReclamation'])->name('reclamations.chat-messages.store');
  315. Route::delete('reclamations/{reclamation}/chat-messages/{chatMessage}', [ChatMessageController::class, 'destroyForReclamation'])
  316. ->name('reclamations.chat-messages.delete');
  317. Route::post('reclamations/{reclamation}/upload-photo-before', [ReclamationController::class, 'uploadPhotoBefore'])->name('reclamations.upload-photo-before');
  318. Route::post('reclamations/{reclamation}/upload-photo-after', [ReclamationController::class, 'uploadPhotoAfter'])->name('reclamations.upload-photo-after');
  319. Route::post('reclamations/{reclamation}/upload-act', [ReclamationController::class, 'uploadAct'])
  320. ->name('reclamations.upload-act');
  321. Route::delete('reclamations/delete-act/{reclamation}/{file}', [ReclamationController::class, 'deleteAct'])
  322. ->name('reclamations.delete-act');
  323. Route::get('schedule', [ScheduleController::class, 'index'])->name('schedule.index');
  324. Route::post('order/export', [OrderController::class, 'export'])
  325. ->name('order.export');
  326. // ajax search products
  327. Route::get('product/search', [ProductController::class, 'search'])->name('product.search');
  328. // ajax search products
  329. Route::get('order-search', [OrderController::class, 'search'])->name('order.search');
  330. // ajax get areas by district
  331. Route::get('areas/{district_id?}', [AreaController::class, 'ajaxGetAreasByDistrict'])->name('area.ajax-get-areas-by-district');
  332. // Каталог запчастей
  333. Route::prefix('spare-parts')->name('spare_parts.')->group(function () {
  334. Route::get('/', [SparePartController::class, 'index'])->name('index');
  335. Route::get('/help', [SparePartController::class, 'help'])->name('help');
  336. Route::get('/search', [SparePartController::class, 'search'])->name('search');
  337. Route::get('/create', [SparePartController::class, 'create'])->name('create');
  338. Route::get('/{sparePart}', [SparePartController::class, 'show'])->name('show');
  339. Route::post('/', [SparePartController::class, 'store'])->name('store');
  340. Route::put('/{sparePart}', [SparePartController::class, 'update'])->name('update');
  341. Route::delete('/{sparePart}', [SparePartController::class, 'destroy'])->name('destroy');
  342. Route::post('/export', [SparePartController::class, 'export'])->name('export');
  343. Route::post('/import', [SparePartController::class, 'import'])->name('import');
  344. Route::post('/{sparePart}/upload-image', [SparePartController::class, 'uploadImage'])->name('upload_image');
  345. });
  346. // Заказы запчастей
  347. Route::prefix('spare-part-orders')->name('spare_part_orders.')->group(function () {
  348. Route::get('/', [SparePartOrderController::class, 'index'])->name('index');
  349. Route::get('/create', [SparePartOrderController::class, 'create'])->name('create');
  350. Route::get('/{sparePartOrder}', [SparePartOrderController::class, 'show'])->name('show');
  351. Route::post('/', [SparePartOrderController::class, 'store'])->name('store');
  352. Route::put('/{sparePartOrder}', [SparePartOrderController::class, 'update'])->name('update');
  353. Route::delete('/{sparePartOrder}', [SparePartOrderController::class, 'destroy'])->name('destroy');
  354. Route::post('/{sparePartOrder}/ship', [SparePartOrderController::class, 'ship'])->name('ship');
  355. Route::post('/{sparePartOrder}/set-in-stock', [SparePartOrderController::class, 'setInStock'])->name('set_in_stock');
  356. Route::post('/set-order-in-stock', [SparePartOrderController::class, 'setOrderInStock'])->name('set_order_in_stock');
  357. Route::post('/{sparePartOrder}/correct', [SparePartOrderController::class, 'correct'])->name('correct');
  358. });
  359. // Резервы запчастей
  360. Route::prefix('spare-part-reservations')->name('spare_part_reservations.')->group(function () {
  361. Route::get('/reclamation/{reclamationId}', [SparePartReservationController::class, 'forReclamation'])->name('for_reclamation');
  362. Route::get('/shortages/{reclamationId}', [SparePartReservationController::class, 'shortagesForReclamation'])->name('shortages_for_reclamation');
  363. Route::post('/{reservation}/cancel', [SparePartReservationController::class, 'cancel'])->name('cancel');
  364. Route::post('/{reservation}/reassign', [SparePartReservationController::class, 'reassign'])->name('reassign');
  365. Route::post('/{reservation}/issue', [SparePartReservationController::class, 'issue'])->name('issue');
  366. Route::post('/issue-all/{reclamationId}', [SparePartReservationController::class, 'issueAllForReclamation'])->name('issue_all');
  367. Route::post('/cancel-all/{reclamationId}', [SparePartReservationController::class, 'cancelAllForReclamation'])->name('cancel_all');
  368. });
  369. // Контроль наличия
  370. Route::get('/spare-part-inventory', [SparePartInventoryController::class, 'index'])->name('spare_part_inventory.index');
  371. // API для получения расшифровки кодов (без ограничения по роли, должны быть ПЕРЕД группой с prefix)
  372. Route::get('/pricing-codes/get-description', [PricingCodeController::class, 'getDescription'])->name('pricing_codes.get_description');
  373. Route::get('/pricing-codes/search', [PricingCodeController::class, 'search'])->name('pricing_codes.search');
  374. // Справочник расшифровок (admin only)
  375. Route::prefix('pricing-codes')->name('pricing_codes.')->group(function () {
  376. Route::get('/', [PricingCodeController::class, 'index'])->name('index');
  377. Route::post('/', [PricingCodeController::class, 'store'])->name('store');
  378. Route::put('/{pricingCode}', [PricingCodeController::class, 'update'])->name('update');
  379. Route::delete('/{pricingCode}', [PricingCodeController::class, 'destroy'])->name('destroy');
  380. });
  381. });