# Firma İçe Aktarma Sistemi

Bu sistem, Excel dosyalarından toplu firma ve bakiye verilerini sisteme aktarmanıza olanak tanır.

## 📋 Özellikler

- ✅ Excel dosyasından toplu firma ekleme
- ✅ Vergi numarasına göre firma kontrolü (var olan güncellenir, yok olan eklenir)
- ✅ Otomatik açılış bakiyesi faturası oluşturma
- ✅ İşletme (team) ve kullanıcı bilgilerini otomatik atama
- ✅ Önizleme özelliği
- ✅ Detaylı hata raporlama
- ✅ İndirilebilir Excel şablonu

## 🗂️ Dosya Yapısı

### Models
- `app/Models/Invoice.php` - Fatura modeli
- `app/Models/InvoiceLine.php` - Fatura satırı modeli
- `app/Models/Company.php` - Firma modeli (güncellenmiş)

### Services
- `app/Services/CompanyImportService.php` - İçe aktarma iş mantığı

### Controllers
- `app/Http/Controllers/CompanyImportController.php` - HTTP isteklerini yöneten controller

### Views
- `resources/views/companies/import.blade.php` - İçe aktarma arayüzü

### Routes
```php
GET  /companies/import          - İçe aktarma sayfası
GET  /companies/import/template - Excel şablonunu indir
POST /companies/import          - Dosya yükle ve içe aktar
POST /companies/import/preview  - Önizleme
```

## 📊 Veritabanı Yapısı

### companies tablosu
- `company_name` - Firma adı
- `company_type` - Firma tipi
- `company_city` - İl
- `company_country` - Ülke
- `current_team_id` - İşletme ID (zorunlu)
- `user_id` - Kullanıcı ID (zorunlu)

### addresses tablosu (type='billing' fatura adresleri)
- `company_id` - Firma ID
- `type` - Adres tipi ('billing' = Fatura Adresi)
- `title` - Başlık
- `line_1` - Adres satır 1 (zorunlu)
- `line_2` - Adres satır 2 / İlçe
- `city` - İl/Şehir (zorunlu)
- `state` - Bölge/State (zorunlu)
- `zip` - Posta Kodu (zorunlu)
- `country` - Ülke (zorunlu)
- `tax_office` - Vergi Dairesi
- `vat_number` - Vergi Numarası
- `current_team_id` - İşletme ID (zorunlu)
- `user_id` - Kullanıcı ID (zorunlu)

### invoices tablosu
- `company_id` - Firma ID
- `type` - Fatura tipi (sales/purchase)
- `total_amount` - Toplam tutar
- `status` - Durum
- `note` - Not
- `to_name`, `to_city`, vb. - Müşteri bilgileri (addresses tablosundan alınır)
- `current_team_id` - İşletme ID (zorunlu)
- `user_id` - Kullanıcı ID (zorunlu)

## 🚀 Kullanım

### 1. Excel Şablonunu İndirin
`/companies/import` sayfasından şablonu indirin.

### 2. Excel Formatı
Excel dosyanızda şu sütunlar olmalı (★ işaretliler zorunlu):

| İşletme Adı★ | Vergi No | Vergi Dairesi | Adres (Satır 1)★ | Adres (Satır 2/İlçe) | İl/Şehir★ | Bölge/State★ | Posta Kodu★ | Ülke★ | Bakiye |
|-------------|----------|---------------|------------------|----------------------|-----------|--------------|-------------|-------|--------|
| ABC Ltd. | 1234567890 | Çankaya VD | Atatürk Cad. No:5 | Çankaya | Ankara | Ankara | 06100 | Türkiye | 5000 |
| XYZ A.Ş. | 9876543210 | Kadıköy VD | İstiklal Cad. No:10 | Kadıköy | İstanbul | İstanbul | 34710 | Türkiye | -2500 |

### 3. Dosyayı Yükleyin
- İşletme seçin (current_team_id)
- Excel dosyasını seçin
- Önizleme ile kontrol edin (opsiyonel)
- "İçe Aktar" butonuna tıklayın

## 🔄 İçe Aktarma Mantığı

1. **Firma Oluşturma**: Firma adına göre kontrol edilir
   - Var ise: Mevcut firma kullanılır
   - Yok ise: Yeni firma oluşturulur

2. **Fatura Adresi**: Her firma için `type='billing'` ile adres oluşturulur
   - Aynı firma için fatura adresi var ise: Güncellenir
   - Yok ise: Yeni adres oluşturulur
   - Vergi numarası ve vergi dairesi adres tablosunda tutulur

3. **Bakiye İşlemi**: 
   - Bakiye > 0: Satış faturası oluşturulur
   - Bakiye < 0: Alış faturası oluşturulur  
   - Bakiye = 0: Fatura oluşturulmaz
   - Fatura bilgileri adres tablosundan alınır

4. **Transaction**: Tüm işlem transaction içinde yapılır, hata durumunda geri alınır

## 💻 Programatik Kullanım

```php
use App\Services\CompanyImportService;

$service = new CompanyImportService();

// Tek firma
$data = [
    'name' => 'ABC Ltd.',
    'tax_number' => '1234567890',
    'tax_office' => 'Çankaya Vergi Dairesi',
    'address' => 'Atatürk Cad. No:5',
    'district' => 'Çankaya',
    'city' => 'Ankara',
    'state' => 'Ankara',
    'zip' => '06100',
    'country' => 'Türkiye',
    'balance' => 5000,
];

$result = $service->importCompanyWithBalance($data, $teamId, $userId);

// Toplu içe aktarma
$dataList = [...]; // Birden fazla veri
$results = $service->bulkImport($dataList, $teamId, $userId);
```

## 🔐 Güvenlik

- Middleware ile auth kontrolü yapılır
- CSRF koruması aktif
- Dosya tipi ve boyut validasyonu
- SQL Injection koruması (Eloquent ORM)
- Transaction ile veri tutarlılığı

## 📦 Gereksinimler

- Laravel 10+
- PHP 8.1+
- PhpSpreadsheet (composer require phpoffice/phpspreadsheet)

## ⚙️ Kurulum

1. Migration'ı çalıştırın:
```bash
php artisan migrate
```

2. Storage dizinini oluşturun:
```bash
php artisan storage:link
```

## 🐛 Hata Ayıklama

Hata oluşması durumunda:
- `storage/logs/laravel.log` dosyasını kontrol edin
- Sonuç sayfasında detaylı hata raporu gösterilir
- Her satır için ayrı hata mesajı

## 📝 Notlar

- `current_team_id` ve `user_id` her kayıt için zorunludur
- Addresses tablosu için zorunlu alanlar: `line_1`, `city`, `state`, `zip`, `country`
- Vergi numarası ve vergi dairesi `addresses` tablosunda `type='billing'` olarak saklanır
- Her firma için bir fatura adresi (`billing`) otomatik oluşturulur
- Excel dosyası maksimum 10MB olabilir
- Desteklenen formatlar: .xlsx, .xls, .csv
