import os import json from datetime import datetime from typing import Dict, List, Optional, Union import docx from docx.shared import Pt, Cm from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.style import WD_STYLE_TYPE import openpyxl from openpyxl.styles import Font, Alignment, PatternFill, Border, Side from openpyxl.utils import get_column_letter from sqlalchemy.orm import Session from app.db.models import Document # Doküman çıktı dizini OUTPUT_DIR = os.path.join(os.getcwd(), 'uploads') os.makedirs(OUTPUT_DIR, exist_ok=True) def create_word_document(data: Dict, template_type: str = 'maliyet_raporu') -> str: """ Verilen verilerle Word dokümanı oluşturur Args: data: Doküman içeriği için veriler template_type: Şablon türü (maliyet_raporu, teklif, vs.) Returns: Oluşturulan dosyanın yolu """ doc = docx.Document() # Stil oluştur styles = doc.styles # Başlık stili if 'Başlık' not in styles: style = styles.add_style('Başlık', WD_STYLE_TYPE.PARAGRAPH) font = style.font font.name = 'Arial' font.size = Pt(16) font.bold = True # Alt başlık stili if 'Alt Başlık' not in styles: style = styles.add_style('Alt Başlık', WD_STYLE_TYPE.PARAGRAPH) font = style.font font.name = 'Arial' font.size = Pt(14) font.bold = True # Normal metin stili if 'Normal Metin' not in styles: style = styles.add_style('Normal Metin', WD_STYLE_TYPE.PARAGRAPH) font = style.font font.name = 'Arial' font.size = Pt(11) # Tablo başlık stili if 'Tablo Başlık' not in styles: style = styles.add_style('Tablo Başlık', WD_STYLE_TYPE.PARAGRAPH) font = style.font font.name = 'Arial' font.size = Pt(11) font.bold = True # Şablon türüne göre doküman oluştur if template_type == 'maliyet_raporu': _create_cost_report_word(doc, data) elif template_type == 'teklif': _create_offer_word(doc, data) else: # Varsayılan şablon _create_default_word(doc, data) # Dosyayı kaydet timestamp = datetime.now().strftime('%Y%m%d%H%M%S') filename = f"{timestamp}_{template_type}.docx" file_path = os.path.join(OUTPUT_DIR, filename) doc.save(file_path) return file_path def _create_cost_report_word(doc, data): """ Maliyet raporu Word dokümanı oluşturur """ # Başlık heading = doc.add_paragraph("MALİYET RAPORU", style='Başlık') heading.alignment = WD_ALIGN_PARAGRAPH.CENTER # Tarih date_paragraph = doc.add_paragraph(f"Tarih: {datetime.now().strftime('%d.%m.%Y')}", style='Normal Metin') date_paragraph.alignment = WD_ALIGN_PARAGRAPH.RIGHT doc.add_paragraph() # Proje bilgileri if 'proje_bilgileri' in data: doc.add_paragraph("PROJE BİLGİLERİ", style='Alt Başlık') for key, value in data['proje_bilgileri'].items(): doc.add_paragraph(f"{key}: {value}", style='Normal Metin') doc.add_paragraph() # İşçilik maliyetleri if 'iscilik_maliyetleri' in data: doc.add_paragraph("İŞÇİLİK MALİYETLERİ", style='Alt Başlık') # Tablo oluştur table = doc.add_table(rows=1, cols=4) table.style = 'Table Grid' # Tablo başlıkları header_cells = table.rows[0].cells header_cells[0].text = "Pozisyon" header_cells[1].text = "Saat Ücreti (TL)" header_cells[2].text = "Süre (Saat)" header_cells[3].text = "Toplam (TL)" # Başlık hücrelerini kalın yap for cell in header_cells: for paragraph in cell.paragraphs: for run in paragraph.runs: run.font.bold = True # Verileri tabloya ekle for item in data['iscilik_maliyetleri']: row_cells = table.add_row().cells row_cells[0].text = item.get('pozisyon', '') row_cells[1].text = str(item.get('saat_ucreti', 0)) row_cells[2].text = str(item.get('sure', 0)) row_cells[3].text = str(item.get('toplam', 0)) # Toplam satırı if 'iscilik_toplam' in data: row_cells = table.add_row().cells row_cells[0].text = "TOPLAM" row_cells[0].merge(row_cells[2]) row_cells[3].text = str(data['iscilik_toplam']) # Toplam satırını kalın yap for cell in [row_cells[0], row_cells[3]]: for paragraph in cell.paragraphs: for run in paragraph.runs: run.font.bold = True doc.add_paragraph() # Malzeme maliyetleri if 'malzeme_maliyetleri' in data: doc.add_paragraph("MALZEME MALİYETLERİ", style='Alt Başlık') # Tablo oluştur table = doc.add_table(rows=1, cols=5) table.style = 'Table Grid' # Tablo başlıkları header_cells = table.rows[0].cells header_cells[0].text = "Malzeme" header_cells[1].text = "Birim Fiyat (TL)" header_cells[2].text = "Miktar" header_cells[3].text = "Birim" header_cells[4].text = "Toplam (TL)" # Başlık hücrelerini kalın yap for cell in header_cells: for paragraph in cell.paragraphs: for run in paragraph.runs: run.font.bold = True # Verileri tabloya ekle for item in data['malzeme_maliyetleri']: row_cells = table.add_row().cells row_cells[0].text = item.get('malzeme', '') row_cells[1].text = str(item.get('birim_fiyat', 0)) row_cells[2].text = str(item.get('miktar', 0)) row_cells[3].text = item.get('birim', '') row_cells[4].text = str(item.get('toplam', 0)) # Toplam satırı if 'malzeme_toplam' in data: row_cells = table.add_row().cells row_cells[0].text = "TOPLAM" row_cells[0].merge(row_cells[3]) row_cells[4].text = str(data['malzeme_toplam']) # Toplam satırını kalın yap for cell in [row_cells[0], row_cells[4]]: for paragraph in cell.paragraphs: for run in paragraph.runs: run.font.bold = True doc.add_paragraph() # Toplam maliyet if 'toplam_maliyet' in data: doc.add_paragraph("TOPLAM MALİYET", style='Alt Başlık') # Tablo oluştur table = doc.add_table(rows=1, cols=2) table.style = 'Table Grid' # Tablo başlıkları header_cells = table.rows[0].cells header_cells[0].text = "Maliyet Kalemi" header_cells[1].text = "Tutar (TL)" # Başlık hücrelerini kalın yap for cell in header_cells: for paragraph in cell.paragraphs: for run in paragraph.runs: run.font.bold = True # İşçilik toplamı if 'iscilik_toplam' in data: row_cells = table.add_row().cells row_cells[0].text = "İşçilik Maliyeti" row_cells[1].text = str(data['iscilik_toplam']) # Malzeme toplamı if 'malzeme_toplam' in data: row_cells = table.add_row().cells row_cells[0].text = "Malzeme Maliyeti" row_cells[1].text = str(data['malzeme_toplam']) # Diğer maliyetler if 'diger_maliyetler' in data: for key, value in data['diger_maliyetler'].items(): row_cells = table.add_row().cells row_cells[0].text = key row_cells[1].text = str(value) # Toplam maliyet row_cells = table.add_row().cells row_cells[0].text = "TOPLAM MALİYET" row_cells[1].text = str(data['toplam_maliyet']) # Toplam satırını kalın yap for cell in row_cells: for paragraph in cell.paragraphs: for run in paragraph.runs: run.font.bold = True doc.add_paragraph() # Kar marjı ve teklif fiyatı if 'kar_marji' in data and 'teklif_fiyati' in data: doc.add_paragraph("TEKLİF BİLGİLERİ", style='Alt Başlık') # Tablo oluştur table = doc.add_table(rows=1, cols=2) table.style = 'Table Grid' # Tablo başlıkları header_cells = table.rows[0].cells header_cells[0].text = "Kalem" header_cells[1].text = "Değer" # Başlık hücrelerini kalın yap for cell in header_cells: for paragraph in cell.paragraphs: for run in paragraph.runs: run.font.bold = True # Toplam maliyet row_cells = table.add_row().cells row_cells[0].text = "Toplam Maliyet (TL)" row_cells[1].text = str(data['toplam_maliyet']) # Kar marjı row_cells = table.add_row().cells row_cells[0].text = "Kar Marjı (%)" row_cells[1].text = str(data['kar_marji']) # Kar tutarı if 'kar_tutari' in data: row_cells = table.add_row().cells row_cells[0].text = "Kar Tutarı (TL)" row_cells[1].text = str(data['kar_tutari']) # Teklif fiyatı row_cells = table.add_row().cells row_cells[0].text = "TEKLİF FİYATI (TL)" row_cells[1].text = str(data['teklif_fiyati']) # Teklif fiyatı satırını kalın yap for cell in row_cells: for paragraph in cell.paragraphs: for run in paragraph.runs: run.font.bold = True def _create_offer_word(doc, data): """ Teklif Word dokümanı oluşturur """ # Başlık heading = doc.add_paragraph("TEKLİF", style='Başlık') heading.alignment = WD_ALIGN_PARAGRAPH.CENTER # Tarih ve referans date_paragraph = doc.add_paragraph(f"Tarih: {datetime.now().strftime('%d.%m.%Y')}", style='Normal Metin') date_paragraph.alignment = WD_ALIGN_PARAGRAPH.RIGHT if 'referans_no' in data: ref_paragraph = doc.add_paragraph(f"Referans No: {data['referans_no']}", style='Normal Metin') ref_paragraph.alignment = WD_ALIGN_PARAGRAPH.RIGHT doc.add_paragraph() # Müşteri bilgileri if 'musteri_bilgileri' in data: doc.add_paragraph("MÜŞTERİ BİLGİLERİ", style='Alt Başlık') for key, value in data['musteri_bilgileri'].items(): doc.add_paragraph(f"{key}: {value}", style='Normal Metin') doc.add_paragraph() # Proje bilgileri if 'proje_bilgileri' in data: doc.add_paragraph("PROJE BİLGİLERİ", style='Alt Başlık') for key, value in data['proje_bilgileri'].items(): doc.add_paragraph(f"{key}: {value}", style='Normal Metin') doc.add_paragraph() # Teklif detayları if 'teklif_detaylari' in data: doc.add_paragraph("TEKLİF DETAYLARI", style='Alt Başlık') # Tablo oluştur table = doc.add_table(rows=1, cols=5) table.style = 'Table Grid' # Tablo başlıkları header_cells = table.rows[0].cells header_cells[0].text = "Kalem" header_cells[1].text = "Açıklama" header_cells[2].text = "Miktar" header_cells[3].text = "Birim Fiyat (TL)" header_cells[4].text = "Toplam (TL)" # Başlık hücrelerini kalın yap for cell in header_cells: for paragraph in cell.paragraphs: for run in paragraph.runs: run.font.bold = True # Verileri tabloya ekle for item in data['teklif_detaylari']: row_cells = table.add_row().cells row_cells[0].text = item.get('kalem', '') row_cells[1].text = item.get('aciklama', '') row_cells[2].text = str(item.get('miktar', 0)) row_cells[3].text = str(item.get('birim_fiyat', 0)) row_cells[4].text = str(item.get('toplam', 0)) # Toplam satırı if 'toplam_fiyat' in data: row_cells = table.add_row().cells row_cells[0].text = "TOPLAM" row_cells[0].merge(row_cells[3]) row_cells[4].text = str(data['toplam_fiyat']) # Toplam satırını kalın yap for cell in [row_cells[0], row_cells[4]]: for paragraph in cell.paragraphs: for run in paragraph.runs: run.font.bold = True doc.add_paragraph() # Ödeme ve teslimat koşulları if 'odeme_kosullari' in data or 'teslimat_kosullari' in data: doc.add_paragraph("ÖDEME VE TESLİMAT KOŞULLARI", style='Alt Başlık') if 'odeme_kosullari' in data: doc.add_paragraph("Ödeme Koşulları:", style='Tablo Başlık') doc.add_paragraph(data['odeme_kosullari'], style='Normal Metin') if 'teslimat_kosullari' in data: doc.add_paragraph("Teslimat Koşulları:", style='Tablo Başlık') doc.add_paragraph(data['teslimat_kosullari'], style='Normal Metin') doc.add_paragraph() # Geçerlilik süresi if 'gecerlilik_suresi' in data: doc.add_paragraph("GEÇERLİLİK SÜRESİ", style='Alt Başlık') doc.add_paragraph(data['gecerlilik_suresi'], style='Normal Metin') doc.add_paragraph() # İmza doc.add_paragraph("Saygılarımızla,", style='Normal Metin') doc.add_paragraph() doc.add_paragraph() doc.add_paragraph("[İmza]", style='Normal Metin') if 'firma_bilgileri' in data: for key, value in data['firma_bilgileri'].items(): doc.add_paragraph(f"{value}", style='Normal Metin') def _create_default_word(doc, data): """ Varsayılan Word dokümanı oluşturur """ # Başlık heading = doc.add_paragraph(data.get('baslik', 'DOKÜMAN'), style='Başlık') heading.alignment = WD_ALIGN_PARAGRAPH.CENTER # Tarih date_paragraph = doc.add_paragraph(f"Tarih: {datetime.now().strftime('%d.%m.%Y')}", style='Normal Metin') date_paragraph.alignment = WD_ALIGN_PARAGRAPH.RIGHT doc.add_paragraph() # İçerik if 'icerik' in data: for item in data['icerik']: if item.get('tip') == 'baslik': doc.add_paragraph(item.get('metin', ''), style='Alt Başlık') elif item.get('tip') == 'paragraf': doc.add_paragraph(item.get('metin', ''), style='Normal Metin') elif item.get('tip') == 'liste': for liste_item in item.get('liste_ogeler', []): paragraph = doc.add_paragraph(style='List Bullet') paragraph.add_run(liste_item) def create_excel_document(data: Dict, template_type: str = 'maliyet_raporu') -> str: """ Verilen verilerle Excel dokümanı oluşturur Args: data: Doküman içeriği için veriler template_type: Şablon türü (maliyet_raporu, teklif, vs.) Returns: Oluşturulan dosyanın yolu """ wb = openpyxl.Workbook() # Şablon türüne göre doküman oluştur if template_type == 'maliyet_raporu': _create_cost_report_excel(wb, data) elif template_type == 'teklif': _create_offer_excel(wb, data) else: # Varsayılan şablon _create_default_excel(wb, data) # Dosyayı kaydet timestamp = datetime.now().strftime('%Y%m%d%H%M%S') filename = f"{timestamp}_{template_type}.xlsx" file_path = os.path.join(OUTPUT_DIR, filename) wb.save(file_path) return file_path def _create_cost_report_excel(wb, data): """ Maliyet raporu Excel dokümanı oluşturur """ # Varsayılan sayfayı sil if 'Sheet' in wb.sheetnames: del wb['Sheet'] # Sayfalar oluştur ws_summary = wb.create_sheet("Özet") ws_labor = wb.create_sheet("İşçilik Maliyetleri") ws_material = wb.create_sheet("Malzeme Maliyetleri") # Stil tanımlamaları header_font = Font(name='Arial', size=12, bold=True) normal_font = Font(name='Arial', size=11) total_font = Font(name='Arial', size=11, bold=True) header_fill = PatternFill(start_color="DDDDDD", end_color="DDDDDD", fill_type="solid") total_fill = PatternFill(start_color="EEEEEE", end_color="EEEEEE", fill_type="solid") center_align = Alignment(horizontal='center', vertical='center') right_align = Alignment(horizontal='right', vertical='center') thin_border = Border( left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin') ) # Özet sayfası ws_summary.column_dimensions['A'].width = 30 ws_summary.column_dimensions['B'].width = 15 # Başlık ws_summary.merge_cells('A1:B1') ws_summary['A1'] = "MALİYET RAPORU" ws_summary['A1'].font = Font(name='Arial', size=14, bold=True) ws_summary['A1'].alignment = center_align # Tarih ws_summary['A2'] = "Tarih:" ws_summary['B2'] = datetime.now().strftime('%d.%m.%Y') ws_summary['A2'].font = normal_font ws_summary['B2'].font = normal_font # Proje bilgileri row = 4 if 'proje_bilgileri' in data: ws_summary['A3'] = "PROJE BİLGİLERİ" ws_summary['A3'].font = header_font for key, value in data['proje_bilgileri'].items(): ws_summary[f'A{row}'] = key ws_summary[f'B{row}'] = value ws_summary[f'A{row}'].font = normal_font ws_summary[f'B{row}'].font = normal_font row += 1 row += 1 # Toplam maliyet tablosu ws_summary[f'A{row}'] = "TOPLAM MALİYET" ws_summary[f'A{row}'].font = header_font row += 1 # Tablo başlıkları ws_summary[f'A{row}'] = "Maliyet Kalemi" ws_summary[f'B{row}'] = "Tutar (TL)" ws_summary[f'A{row}'].font = header_font ws_summary[f'B{row}'].font = header_font ws_summary[f'A{row}'].fill = header_fill ws_summary[f'B{row}'].fill = header_fill ws_summary[f'A{row}'].border = thin_border ws_summary[f'B{row}'].border = thin_border row += 1 # İşçilik toplamı if 'iscilik_toplam' in data: ws_summary[f'A{row}'] = "İşçilik Maliyeti" ws_summary[f'B{row}'] = data['iscilik_toplam'] ws_summary[f'A{row}'].font = normal_font ws_summary[f'B{row}'].font = normal_font ws_summary[f'A{row}'].border = thin_border ws_summary[f'B{row}'].border = thin_border row += 1 # Malzeme toplamı if 'malzeme_toplam' in data: ws_summary[f'A{row}'] = "Malzeme Maliyeti" ws_summary[f'B{row}'] = data['malzeme_toplam'] ws_summary[f'A{row}'].font = normal_font ws_summary[f'B{row}'].font = normal_font ws_summary[f'A{row}'].border = thin_border ws_summary[f'B{row}'].border = thin_border row += 1 # Diğer maliyetler if 'diger_maliyetler' in data: for key, value in data['diger_maliyetler'].items(): ws_summary[f'A{row}'] = key ws_summary[f'B{row}'] = value ws_summary[f'A{row}'].font = normal_font ws_summary[f'B{row}'].font = normal_font ws_summary[f'A{row}'].border = thin_border ws_summary[f'B{row}'].border = thin_border row += 1 # Toplam maliyet if 'toplam_maliyet' in data: ws_summary[f'A{row}'] = "TOPLAM MALİYET" ws_summary[f'B{row}'] = data['toplam_maliyet'] ws_summary[f'A{row}'].font = total_font ws_summary[f'B{row}'].font = total_font ws_summary[f'A{row}'].fill = total_fill ws_summary[f'B{row}'].fill = total_fill ws_summary[f'A{row}'].border = thin_border ws_summary[f'B{row}'].border = thin_border row += 2 # Kar marjı ve teklif fiyatı if 'kar_marji' in data and 'teklif_fiyati' in data: ws_summary[f'A{row}'] = "TEKLİF BİLGİLERİ" ws_summary[f'A{row}'].font = header_font row += 1 # Tablo başlıkları ws_summary[f'A{row}'] = "Kalem" ws_summary[f'B{row}'] = "Değer" ws_summary[f'A{row}'].font = header_font ws_summary[f'B{row}'].font = header_font ws_summary[f'A{row}'].fill = header_fill ws_summary[f'B{row}'].fill = header_fill ws_summary[f'A{row}'].border = thin_border ws_summary[f'B{row}'].border = thin_border row += 1 # Toplam maliyet ws_summary[f'A{row}'] = "Toplam Maliyet (TL)" ws_summary[f'B{row}'] = data['toplam_maliyet'] ws_summary[f'A{row}'].font = normal_font ws_summary[f'B{row}'].font = normal_font ws_summary[f'A{row}'].border = thin_border ws_summary[f'B{row}'].border = thin_border row += 1 # Kar marjı ws_summary[f'A{row}'] = "Kar Marjı (%)" ws_summary[f'B{row}'] = data['kar_marji'] ws_summary[f'A{row}'].font = normal_font ws_summary[f'B{row}'].font = normal_font ws_summary[f'A{row}'].border = thin_border ws_summary[f'B{row}'].border = thin_border row += 1 # Kar tutarı if 'kar_tutari' in data: ws_summary[f'A{row}'] = "Kar Tutarı (TL)" ws_summary[f'B{row}'] = data['kar_tutari'] ws_summary[f'A{row}'].font = normal_font ws_summary[f'B{row}'].font = normal_font ws_summary[f'A{row}'].border = thin_border ws_summary[f'B{row}'].border = thin_border row += 1 # Teklif fiyatı ws_summary[f'A{row}'] = "TEKLİF FİYATI (TL)" ws_summary[f'B{row}'] = data['teklif_fiyati'] ws_summary[f'A{row}'].font = total_font ws_summary[f'B{row}'].font = total_font ws_summary[f'A{row}'].fill = total_fill ws_summary[f'B{row}'].fill = total_fill ws_summary[f'A{row}'].border = thin_border ws_summary[f'B{row}'].border = thin_border # İşçilik maliyetleri sayfası if 'iscilik_maliyetleri' in data: ws_labor.column_dimensions['A'].width = 30 ws_labor.column_dimensions['B'].width = 15 ws_labor.column_dimensions['C'].width = 15 ws_labor.column_dimensions['D'].width = 15 # Başlık ws_labor.merge_cells('A1:D1') ws_labor['A1'] = "İŞÇİLİK MALİYETLERİ" ws_labor['A1'].font = Font(name='Arial', size=14, bold=True) ws_labor['A1'].alignment = center_align # Tablo başlıkları ws_labor['A3'] = "Pozisyon" ws_labor['B3'] = "Saat Ücreti (TL)" ws_labor['C3'] = "Süre (Saat)" ws_labor['D3'] = "Toplam (TL)" for col in ['A', 'B', 'C', 'D']: ws_labor[f'{col}3'].font = header_font ws_labor[f'{col}3'].fill = header_fill ws_labor[f'{col}3'].border = thin_border # Verileri tabloya ekle row = 4 for item in data['iscilik_maliyetleri']: ws_labor[f'A{row}'] = item.get('pozisyon', '') ws_labor[f'B{row}'] = item.get('saat_ucreti', 0) ws_labor[f'C{row}'] = item.get('sure', 0) ws_labor[f'D{row}'] = item.get('toplam', 0) for col in ['A', 'B', 'C', 'D']: ws_labor[f'{col}{row}'].font = normal_font ws_labor[f'{col}{row}'].border = thin_border row += 1 # Toplam satırı if 'iscilik_toplam' in data: ws_labor[f'A{row}'] = "TOPLAM" ws_labor[f'D{row}'] = data['iscilik_toplam'] ws_labor.merge_cells(f'A{row}:C{row}') for col in ['A', 'D']: ws_labor[f'{col}{row}'].font = total_font ws_labor[f'{col}{row}'].fill = total_fill ws_labor[f'{col}{row}'].border = thin_border # Malzeme maliyetleri sayfası if 'malzeme_maliyetleri' in data: ws_material.column_dimensions['A'].width = 30 ws_material.column_dimensions['B'].width = 15 ws_material.column_dimensions['C'].width = 15 ws_material.column_dimensions['D'].width = 15 ws_material.column_dimensions['E'].width = 15 # Başlık ws_material.merge_cells('A1:E1') ws_material['A1'] = "MALZEME MALİYETLERİ" ws_material['A1'].font = Font(name='Arial', size=14, bold=True) ws_material['A1'].alignment = center_align # Tablo başlıkları ws_material['A3'] = "Malzeme" ws_material['B3'] = "Birim Fiyat (TL)" ws_material['C3'] = "Miktar" ws_material['D3'] = "Birim" ws_material['E3'] = "Toplam (TL)" for col in ['A', 'B', 'C', 'D', 'E']: ws_material[f'{col}3'].font = header_font ws_material[f'{col}3'].fill = header_fill ws_material[f'{col}3'].border = thin_border # Verileri tabloya ekle row = 4 for item in data['malzeme_maliyetleri']: ws_material[f'A{row}'] = item.get('malzeme', '') ws_material[f'B{row}'] = item.get('birim_fiyat', 0) ws_material[f'C{row}'] = item.get('miktar', 0) ws_material[f'D{row}'] = item.get('birim', '') ws_material[f'E{row}'] = item.get('toplam', 0) for col in ['A', 'B', 'C', 'D', 'E']: ws_material[f'{col}{row}'].font = normal_font ws_material[f'{col}{row}'].border = thin_border row += 1 # Toplam satırı if 'malzeme_toplam' in data: ws_material[f'A{row}'] = "TOPLAM" ws_material[f'E{row}'] = data['malzeme_toplam'] ws_material.merge_cells(f'A{row}:D{row}') for col in ['A', 'E']: ws_material[f'{col}{row}'].font = total_font ws_material[f'{col}{row}'].fill = total_fill ws_material[f'{col}{row}'].border = thin_border def _create_offer_excel(wb, data): """ Teklif Excel dokümanı oluşturur """ # Varsayılan sayfayı sil if 'Sheet' in wb.sheetnames: del wb['Sheet'] # Sayfalar oluştur ws_offer = wb.create_sheet("Teklif") ws_details = wb.create_sheet("Detaylar") # Stil tanımlamaları header_font = Font(name='Arial', size=12, bold=True) normal_font = Font(name='Arial', size=11) total_font = Font(name='Arial', size=11, bold=True) header_fill = PatternFill(start_color="DDDDDD", end_color="DDDDDD", fill_type="solid") total_fill = PatternFill(start_color="EEEEEE", end_color="EEEEEE", fill_type="solid") center_align = Alignment(horizontal='center', vertical='center') right_align = Alignment(horizontal='right', vertical='center') thin_border = Border( left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin') ) # Teklif sayfası ws_offer.column_dimensions['A'].width = 30 ws_offer.column_dimensions['B'].width = 15 ws_offer.column_dimensions['C'].width = 15 ws_offer.column_dimensions['D'].width = 15 ws_offer.column_dimensions['E'].width = 15 # Başlık ws_offer.merge_cells('A1:E1') ws_offer['A1'] = "TEKLİF" ws_offer['A1'].font = Font(name='Arial', size=14, bold=True) ws_offer['A1'].alignment = center_align # Tarih ve referans ws_offer['D2'] = "Tarih:" ws_offer['E2'] = datetime.now().strftime('%d.%m.%Y') ws_offer['D2'].font = normal_font ws_offer['E2'].font = normal_font if 'referans_no' in data: ws_offer['D3'] = "Referans No:" ws_offer['E3'] = data['referans_no'] ws_offer['D3'].font = normal_font ws_offer['E3'].font = normal_font # Müşteri bilgileri row = 5 if 'musteri_bilgileri' in data: ws_offer['A4'] = "MÜŞTERİ BİLGİLERİ" ws_offer['A4'].font = header_font for key, value in data['musteri_bilgileri'].items(): ws_offer[f'A{row}'] = key ws_offer[f'B{row}'] = value ws_offer[f'A{row}'].font = normal_font ws_offer[f'B{row}'].font = normal_font row += 1 row += 1 # Proje bilgileri if 'proje_bilgileri' in data: ws_offer[f'A{row}'] = "PROJE BİLGİLERİ" ws_offer[f'A{row}'].font = header_font row += 1 for key, value in data['proje_bilgileri'].items(): ws_offer[f'A{row}'] = key ws_offer[f'B{row}'] = value ws_offer[f'A{row}'].font = normal_font ws_offer[f'B{row}'].font = normal_font row += 1 row += 1 # Teklif detayları if 'teklif_detaylari' in data: ws_offer[f'A{row}'] = "TEKLİF DETAYLARI" ws_offer[f'A{row}'].font = header_font row += 1 # Tablo başlıkları ws_offer[f'A{row}'] = "Kalem" ws_offer[f'B{row}'] = "Açıklama" ws_offer[f'C{row}'] = "Miktar" ws_offer[f'D{row}'] = "Birim Fiyat (TL)" ws_offer[f'E{row}'] = "Toplam (TL)" for col in ['A', 'B', 'C', 'D', 'E']: ws_offer[f'{col}{row}'].font = header_font ws_offer[f'{col}{row}'].fill = header_fill ws_offer[f'{col}{row}'].border = thin_border row += 1 # Verileri tabloya ekle for item in data['teklif_detaylari']: ws_offer[f'A{row}'] = item.get('kalem', '') ws_offer[f'B{row}'] = item.get('aciklama', '') ws_offer[f'C{row}'] = item.get('miktar', 0) ws_offer[f'D{row}'] = item.get('birim_fiyat', 0) ws_offer[f'E{row}'] = item.get('toplam', 0) for col in ['A', 'B', 'C', 'D', 'E']: ws_offer[f'{col}{row}'].font = normal_font ws_offer[f'{col}{row}'].border = thin_border row += 1 # Toplam satırı if 'toplam_fiyat' in data: ws_offer[f'A{row}'] = "TOPLAM" ws_offer[f'E{row}'] = data['toplam_fiyat'] ws_offer.merge_cells(f'A{row}:D{row}') for col in ['A', 'E']: ws_offer[f'{col}{row}'].font = total_font ws_offer[f'{col}{row}'].fill = total_fill ws_offer[f'{col}{row}'].border = thin_border # Detaylar sayfası ws_details.column_dimensions['A'].width = 30 ws_details.column_dimensions['B'].width = 50 # Başlık ws_details.merge_cells('A1:B1') ws_details['A1'] = "TEKLİF DETAYLARI" ws_details['A1'].font = Font(name='Arial', size=14, bold=True) ws_details['A1'].alignment = center_align row = 3 # Ödeme ve teslimat koşulları if 'odeme_kosullari' in data or 'teslimat_kosullari' in data: ws_details[f'A{row}'] = "ÖDEME VE TESLİMAT KOŞULLARI" ws_details[f'A{row}'].font = header_font row += 1 if 'odeme_kosullari' in data: ws_details[f'A{row}'] = "Ödeme Koşulları:" ws_details[f'A{row}'].font = Font(name='Arial', size=11, bold=True) row += 1 ws_details[f'A{row}'] = data['odeme_kosullari'] ws_details[f'A{row}'].font = normal_font row += 2 if 'teslimat_kosullari' in data: ws_details[f'A{row}'] = "Teslimat Koşulları:" ws_details[f'A{row}'].font = Font(name='Arial', size=11, bold=True) row += 1 ws_details[f'A{row}'] = data['teslimat_kosullari'] ws_details[f'A{row}'].font = normal_font row += 2 # Geçerlilik süresi if 'gecerlilik_suresi' in data: ws_details[f'A{row}'] = "GEÇERLİLİK SÜRESİ" ws_details[f'A{row}'].font = header_font row += 1 ws_details[f'A{row}'] = data['gecerlilik_suresi'] ws_details[f'A{row}'].font = normal_font row += 2 # Firma bilgileri if 'firma_bilgileri' in data: ws_details[f'A{row}'] = "FİRMA BİLGİLERİ" ws_details[f'A{row}'].font = header_font row += 1 for key, value in data['firma_bilgileri'].items(): ws_details[f'A{row}'] = value ws_details[f'A{row}'].font = normal_font row += 1 def _create_default_excel(wb, data): """ Varsayılan Excel dokümanı oluşturur """ # Varsayılan sayfayı al ws = wb.active ws.title = "Doküman" # Stil tanımlamaları header_font = Font(name='Arial', size=12, bold=True) normal_font = Font(name='Arial', size=11) center_align = Alignment(horizontal='center', vertical='center') # Başlık ws.merge_cells('A1:D1') ws['A1'] = data.get('baslik', 'DOKÜMAN') ws['A1'].font = Font(name='Arial', size=14, bold=True) ws['A1'].alignment = center_align # Tarih ws['D2'] = "Tarih:" ws['E2'] = datetime.now().strftime('%d.%m.%Y') ws['D2'].font = normal_font ws['E2'].font = normal_font # İçerik row = 4 if 'icerik' in data: for item in data['icerik']: if item.get('tip') == 'baslik': ws[f'A{row}'] = item.get('metin', '') ws[f'A{row}'].font = header_font row += 1 elif item.get('tip') == 'paragraf': ws[f'A{row}'] = item.get('metin', '') ws[f'A{row}'].font = normal_font row += 1 elif item.get('tip') == 'liste': for liste_item in item.get('liste_ogeler', []): ws[f'A{row}'] = "• " + liste_item ws[f'A{row}'].font = normal_font row += 1 def save_document_to_db(db: Session, filename, content_type, file_path, file_size, document_type, template_type): """ Oluşturulan doküman bilgilerini veritabanına kaydet """ document = Document( filename=filename, content_type=content_type, file_path=file_path, file_size=file_size, document_type=document_type, template_type=template_type ) db.add(document) db.commit() db.refresh(document) return document