diff --git a/app/Http/Controllers/ApiController.php b/app/Http/Controllers/ApiController.php deleted file mode 100644 index cf3558a..0000000 --- a/app/Http/Controllers/ApiController.php +++ /dev/null @@ -1,175 +0,0 @@ -validate($validationRules); - $segments = Segment::listActive(); - - foreach ($segments as $segment) { - foreach ($validatedData as $value) { - UniModel::model($modelName, $segment->connector)->updateOrCreate( - ['code' => $value['Код']], - array_merge($this->mapAttributes($value), $extraProcessing ? $extraProcessing($value, $segment) : []) - ); - } - } - - if (isset($extraProcessing)) { - foreach ($validatedData as $value) { - $this->processParentRelation($modelName, $value); - } - } - - DB::commit(); - return response()->json(['message' => ucfirst($modelName) . ' data synchronized successfully'], 200); - } catch (Exception $e) { - DB::rollBack(); - Log::error('Error syncing ' . $modelName . ' data: ' . $e->getMessage()); - return response()->json(['error' => 'Failed to synchronize ' . $modelName . ' data'], 500); - } - } - - private function mapAttributes($data) - { - return [ - 'is_group' => (bool)($data['ЭтоГруппа'] ?? false), - 'name' => $data['Наименование'] ?? null, - 'comments' => $data['Комментарий'] ?? null, - 'iin' => $data['ИдентификационныйКодЛичности'] ?? null, - 'kbe' => $data['КБЕ'] ?? null, - 'okpo_code' => $data['КодПоОКПО'] ?? null, - 'main_contact' => $data['ОсновноеКонтактноеЛицо'] ?? null, - 'bank_account' => $data['ОсновнойБанковскийСчет'] ?? null, - 'address' => $data['Адрес'] ?? null, - 'phone' => $data['Телефон'] ?? null, - 'mail' => $data['Почта'] ?? null, - 'id_number' => $data['УдНомер'] ?? null, - 'id_date' => $data['УдДата'] ?? null, - 'issued' => $data['УдВыдан'] ?? null, - 'contract_id' => $data['ОсновнойДоговор'] ?? null, - 'deleted_at' => $data['ПометкаУдаления'] ? now() : null, - ]; - } - - private function processParentRelation($modelName, $data) - { - $model = UniModel::model($modelName)->where('name', $data['Наименование'])->first(); - - if ($model && !empty($data['Родитель'])) { - $parent = UniModel::model($modelName)->where('name', $data['Родитель'])->first(); - if ($parent) { - $model->parent_id = $parent->id; - $model->save(); - } - } - } - - public function syncAutoData(Request $request) - { - $validationRules = [ - '*.Код' => 'required|string', - '*.Наименование' => 'required|string', - '*.Тип' => 'required|string', - '*.Класс' => 'required|string', - '*.Марка' => 'required|string', - '*.Модель' => 'required|string', - '*.Цвет' => 'required|string', - '*.СерийныйНомер' => 'nullable|string', - '*.ГосНомер' => 'nullable|string', - '*.ГодПроизводства' => 'nullable|integer', - '*.НомерТехПаспорта' => 'nullable|string', - '*.ДатаТехпаспорта' => 'nullable|date', - '*.ОценочнаяСтоимость' => 'nullable|numeric', - '*.ВладелецИмущества' => 'required|string', - '*.ВДоверенномУправлении' => 'required|boolean', - '*.ПроцентВладельца' => 'nullable|numeric', - '*.НеИспользовать' => 'required|boolean', - '*.Предопределенный' => 'required|boolean', - '*.ИмяПредопределенныхДанных' => 'nullable|string', - '*.ПометкаУдаления' => 'required|boolean', - ]; - - $extraProcessing = function ($value, $segment) { - return [ - 'type_id' => UniModel::model('pipi_auto_types', $segment->connector) - ->firstOrCreate(['name' => $value['Тип']])->id, - 'class_id' => UniModel::model('pipi_auto_classes', $segment->connector) - ->firstOrCreate(['name' => $value['Класс']])->id, - 'brand_id' => UniModel::model('pipi_auto_brands', $segment->connector) - ->firstOrCreate(['name' => $value['Марка']])->id, - 'model_id' => UniModel::model('pipi_brand_models', $segment->connector) - ->firstOrCreate([ - 'name' => $value['Модель'], - 'brand_id' => UniModel::model('pipi_auto_brands', $segment->connector) - ->firstOrCreate(['name' => $value['Марка']])->id, - ])->id, - 'color_id' => UniModel::model('pipi_auto_colors', $segment->connector) - ->firstOrCreate(['name' => $value['Цвет']])->id, - 'owner_id' => UniModel::model('pipi_owners', $segment->connector) - ->firstOrCreate(['name' => $value['ВладелецИмущества']])->id, - ]; - }; - - return $this->syncData($request, 'pipi_auto', $validationRules, $extraProcessing); - } - - public function syncOwners(Request $request) - { - $validationRules = [ - '*.Код' => 'required|string', - '*.Наименование' => 'required|string', - '*.Комментарий' => 'nullable|string', - '*.ИдентификационныйКодЛичности' => 'nullable|string', - '*.КБЕ' => 'nullable|string', - '*.КодПоОКПО' => 'nullable|string', - '*.ОсновноеКонтактноеЛицо' => 'nullable|string', - '*.ОсновнойБанковскийСчет' => 'nullable|string', - '*.Адрес' => 'nullable|string', - '*.Телефон' => 'nullable|string', - '*.Почта' => 'nullable|string', - '*.УдНомер' => 'nullable|string', - '*.УдДата' => 'nullable|date', - '*.УдВыдан' => 'nullable|string', - '*.ОсновнойДоговор' => 'nullable|string', - '*.ЭтоГруппа' => 'required|boolean', - '*.ПометкаУдаления' => 'required|boolean', - '*.Родитель' => 'nullable|string', - ]; - - return $this->syncData($request, 'pipi_owners', $validationRules); - } - - public function syncOwnerContracts(Request $request) - { - $validationRules = [ - '*.Код' => 'required|string', - '*.Наименование' => 'required|string', - '*.Комментарий' => 'nullable|string', - '*.Организация' => 'nullable|string', - '*.НомерДоговора' => 'required|string', - '*.ДатаДоговора' => 'nullable|date', - '*.ДатаНачалаДействияДоговора' => 'nullable|date', - '*.ДатаОкончанияДействияДоговора' => 'nullable|date', - '*.УсловияОплаты' => 'nullable|string', - '*.ЭтоГруппа' => 'required|boolean', - '*.ПометкаУдаления' => 'required|boolean', - '*.Родитель' => 'nullable|string', - ]; - - return $this->syncData($request, 'pipi_owner_contracts', $validationRules); - } -} diff --git a/app/Http/Controllers/Sync1cApiController.php b/app/Http/Controllers/Sync1cApiController.php new file mode 100644 index 0000000..1f983a0 --- /dev/null +++ b/app/Http/Controllers/Sync1cApiController.php @@ -0,0 +1,236 @@ +validate([ + '*.Код' => 'required|string', + '*.Наименование' => 'required|string', + '*.Тип' => 'required|string', + '*.Класс' => 'required|string', + '*.Марка' => 'required|string', + '*.Модель' => 'required|string', + '*.Цвет' => 'required|string', + '*.СерийныйНомер' => 'nullable|string', + '*.ГосНомер' => 'nullable|string', + '*.ГодПроизводства' => 'nullable|integer', + '*.НомерТехПаспорта' => 'nullable|string', + '*.ДатаТехпаспорта' => 'nullable|date', + '*.ОценочнаяСтоимость' => 'nullable|numeric', + '*.ВладелецИмущества' => 'required|string', + '*.ВДоверенномУправлении' => 'required|boolean', + '*.ПроцентВладельца' => 'nullable|numeric', + '*.НеИспользовать' => 'required|boolean', + '*.Предопределенный' => 'required|boolean', + '*.ИмяПредопределенныхДанных' => 'nullable|string', + '*.ПометкаУдаления' => 'required|boolean', + ]); + + $segments = Segment::listActive(); + + foreach ($segments as $segment) { + foreach ($validatedData as $value) { + UniModel::model('pipi_auto', $segment->connector)->updateOrCreate( + [ + 'code' => $value['Код'], + ], + [ + 'name' => $value['Наименование'], + 'type_id' => UniModel::model('pipi_auto_types', $segment->connector) + ->firstOrCreate(['name' => $value['Тип']])->id, + 'class_id' => UniModel::model('pipi_auto_classes', $segment->connector) + ->firstOrCreate(['name' => $value['Класс']])->id, + 'brand_id' => UniModel::model('pipi_auto_brands', $segment->connector) + ->firstOrCreate(['name' => $value['Марка']])->id, + 'model_id' => UniModel::model('pipi_brand_models', $segment->connector) + ->firstOrCreate([ + 'name' => $value['Модель'], + 'brand_id' => UniModel::model('pipi_auto_brands', $segment->connector) + ->firstOrCreate(['name' => $value['Марка']])->id, + ])->id, + 'color_id' => UniModel::model('pipi_auto_colors', $segment->connector) + ->firstOrCreate(['name' => $value['Цвет']])->id, + 'serial_number' => $value['СерийныйНомер'], + 'state_number' => $value['ГосНомер'], + 'manufacture_year' => $value['ГодПроизводства'], + 'passport_number' => $value['НомерТехПаспорта'], + 'passport_date' => $value['ДатаТехпаспорта'], + 'estimated_cost' => $value['ОценочнаяСтоимость'], + 'owner_id' => UniModel::model('pipi_owners', $segment->connector) + ->firstOrCreate(['name' => $value['ВладелецИмущества']])->id, + 'is_trust_management' => (bool)$value['ВДоверенномУправлении'], + 'owner_percentage' => $value['ПроцентВладельца'], + 'is_inactive' => (bool)$value['НеИспользовать'], + 'is_predefined' => (bool)$value['Предопределенный'], + 'predefined_data_name' => $value['ИмяПредопределенныхДанных'], + 'deleted_at' => $value['ПометкаУдаления'] ? now() : null, + ] + ); + } + } + + DB::commit(); + return response()->json(['message' => 'Data synchronized successfully'], 200); + } catch (Exception $e) { + DB::rollBack(); + Log::error('Error syncing auto data: ' . $e->getMessage()); + return response()->json(['error' => 'Failed to synchronize data'], 500); + } + } + public function syncOwners(Request $request) + { + try { + DB::beginTransaction(); + + $validatedData = $request->validate([ + '*.Код' => 'required|string', + '*.Наименование' => 'required|string', + '*.Комментарий' => 'nullable|string', + '*.ИдентификационныйКодЛичности' => 'nullable|string', + '*.КБЕ' => 'nullable|string', + '*.КодПоОКПО' => 'nullable|string', + '*.ОсновноеКонтактноеЛицо' => 'nullable|string', + '*.ОсновнойБанковскийСчет' => 'nullable|string', + '*.Адрес' => 'nullable|string', + '*.Телефон' => 'nullable|string', + '*.Почта' => 'nullable|string', + '*.УдНомер' => 'nullable|string', + '*.УдДата' => 'nullable|date', + '*.УдВыдан' => 'nullable|string', + '*.ОсновнойДоговор' => 'nullable|string', + '*.ЭтоГруппа' => 'required|boolean', + '*.ПометкаУдаления' => 'required|boolean', + '*.Родитель' => 'nullable|string', + ]); + + $segments = Segment::listActive(); + + foreach ($segments as $segment) { + foreach ($validatedData as $value) { + UniModel::model('pipi_owners', $segment->connector)->updateOrCreate( + [ + 'code' => $value['Код'], + ], + [ + 'is_group' => (bool)$value['ЭтоГруппа'], + 'name' => $value['Наименование'], + 'comments' => $value['Комментарий'], + 'iin' => $value['ИдентификационныйКодЛичности'], + 'kbe' => $value['КБЕ'], + 'okpo_code' => $value['КодПоОКПО'], + 'main_contact' => $value['ОсновноеКонтактноеЛицо'], + 'bank_account' => $value['ОсновнойБанковскийСчет'], + 'address' => $value['Адрес'], + 'phone' => $value['Телефон'], + 'mail' => $value['Почта'], + 'id_number' => $value['УдНомер'], + 'id_date' => $value['УдДата'], + 'issued' => $value['УдВыдан'], + 'contract_id' => $value['ОсновнойДоговор'] ? UniModel::model('pipi_owner_contracts', $segment->connector)->firstOrCreate([ + 'name' => $value['ОсновнойДоговор'] + ])->id : null, + 'deleted_at' => $value['ПометкаУдаления'] ? now() : null, + ] + ); + } + } + + foreach ($validatedData as $value) { + $model = UniModel::model('pipi_owners')->where('name', $value['Наименование'])->first(); + + if ($model && $value['Родитель']) { + $parent = UniModel::model('pipi_owners')->where('name', $value['Родитель'])->first(); + if ($parent) { + $model->parent_id = $parent->id; + $model->save(); + } + } + } + + DB::commit(); + return response()->json(['message' => 'Owners synchronized successfully'], 200); + } catch (Exception $e) { + DB::rollBack(); + Log::error('Error syncing owners: ' . $e->getMessage()); + return response()->json(['error' => 'Failed to synchronize owners'], 500); + } + } + + public function syncOwnerContracts(Request $request) + { + try { + DB::beginTransaction(); + + $validatedData = $request->validate([ + '*.Код' => 'required|string', + '*.Наименование' => 'required|string', + '*.Комментарий' => 'nullable|string', + '*.Организация' => 'nullable|string', + '*.НомерДоговора' => 'required|string', + '*.ДатаДоговора' => 'nullable|date', + '*.ДатаНачалаДействияДоговора' => 'nullable|date', + '*.ДатаОкончанияДействияДоговора' => 'nullable|date', + '*.УсловияОплаты' => 'nullable|string', + '*.ЭтоГруппа' => 'required|boolean', + '*.ПометкаУдаления' => 'required|boolean', + '*.Родитель' => 'nullable|string', + ]); + + $segments = Segment::listActive(); + + foreach ($segments as $segment) { + foreach ($validatedData as $value) { + UniModel::model('pipi_owner_contracts', $segment->connector)->updateOrCreate( + [ + 'code' => $value['Код'], + ], + [ + 'is_group' => (bool)$value['ЭтоГруппа'], + 'name' => $value['Наименование'], + 'comments' => $value['Комментарий'], + 'organization' => $value['Организация'], + 'contract_number' => $value['НомерДоговора'], + 'contract_date' => $value['ДатаДоговора'], + 'started_at' => $value['ДатаНачалаДействияДоговора'], + 'ended_at' => $value['ДатаОкончанияДействияДоговора'], + 'payment_type' => $value['УсловияОплаты'], + 'deleted_at' => $value['ПометкаУдаления'] ? now() : null, + ] + ); + } + } + + foreach ($validatedData as $value) { + $model = UniModel::model('pipi_owner_contracts')->where('name', $value['Наименование'])->first(); + + if ($model && $value['Родитель']) { + $parent = UniModel::model('pipi_owner_contracts')->where('name', $value['Родитель'])->first(); + if ($parent) { + $model->parent_id = $parent->id; + $model->save(); + } + } + } + + DB::commit(); + return response()->json(['message' => 'Owner contracts synchronized successfully'], 200); + } catch (Exception $e) { + DB::rollBack(); + Log::error('Error syncing owner contracts: ' . $e->getMessage()); + return response()->json(['error' => 'Failed to synchronize owner contracts'], 500); + } + } +} diff --git a/routes/api.php b/routes/api.php index 6f5a962..ba5648d 100644 --- a/routes/api.php +++ b/routes/api.php @@ -13,10 +13,10 @@ use Illuminate\Support\Facades\Route; | be assigned to the "api" middleware group. Make something great! | */ -use App\Http\Controllers\ApiController; +use App\Http\Controllers\Sync1cApiController; Route::prefix('1c')->group(function () { - Route::post('syncAutoData', [ApiController::class, 'syncAutoData']); - Route::post('syncOwners', [ApiController::class, 'syncOwners']); - Route::post('syncOwnerContracts', [ApiController::class, 'syncOwnerContracts']); + Route::post('syncAutoData', [Sync1cApiController::class, 'syncAutoData']); + Route::post('syncOwners', [Sync1cApiController::class, 'syncOwners']); + Route::post('syncOwnerContracts', [Sync1cApiController::class, 'syncOwnerContracts']); });