| | 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 |
| |
|
| | |
| | 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() |
| | |
| | |
| | styles = doc.styles |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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) |
| | |
| | |
| | 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 |
| | |
| | |
| | if template_type == 'maliyet_raporu': |
| | _create_cost_report_word(doc, data) |
| | elif template_type == 'teklif': |
| | _create_offer_word(doc, data) |
| | else: |
| | |
| | _create_default_word(doc, data) |
| | |
| | |
| | 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 |
| | """ |
| | |
| | heading = doc.add_paragraph("MALİYET RAPORU", style='Başlık') |
| | heading.alignment = WD_ALIGN_PARAGRAPH.CENTER |
| | |
| | |
| | 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() |
| | |
| | |
| | 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() |
| | |
| | |
| | if 'iscilik_maliyetleri' in data: |
| | doc.add_paragraph("İŞÇİLİK MALİYETLERİ", style='Alt Başlık') |
| | |
| | |
| | table = doc.add_table(rows=1, cols=4) |
| | table.style = 'Table Grid' |
| | |
| | |
| | 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)" |
| | |
| | |
| | for cell in header_cells: |
| | for paragraph in cell.paragraphs: |
| | for run in paragraph.runs: |
| | run.font.bold = True |
| | |
| | |
| | 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)) |
| | |
| | |
| | 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']) |
| | |
| | |
| | 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() |
| | |
| | |
| | if 'malzeme_maliyetleri' in data: |
| | doc.add_paragraph("MALZEME MALİYETLERİ", style='Alt Başlık') |
| | |
| | |
| | table = doc.add_table(rows=1, cols=5) |
| | table.style = 'Table Grid' |
| | |
| | |
| | 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)" |
| | |
| | |
| | for cell in header_cells: |
| | for paragraph in cell.paragraphs: |
| | for run in paragraph.runs: |
| | run.font.bold = True |
| | |
| | |
| | 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)) |
| | |
| | |
| | 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']) |
| | |
| | |
| | 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() |
| | |
| | |
| | if 'toplam_maliyet' in data: |
| | doc.add_paragraph("TOPLAM MALİYET", style='Alt Başlık') |
| | |
| | |
| | table = doc.add_table(rows=1, cols=2) |
| | table.style = 'Table Grid' |
| | |
| | |
| | header_cells = table.rows[0].cells |
| | header_cells[0].text = "Maliyet Kalemi" |
| | header_cells[1].text = "Tutar (TL)" |
| | |
| | |
| | for cell in header_cells: |
| | for paragraph in cell.paragraphs: |
| | for run in paragraph.runs: |
| | run.font.bold = True |
| | |
| | |
| | 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']) |
| | |
| | |
| | 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']) |
| | |
| | |
| | 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) |
| | |
| | |
| | row_cells = table.add_row().cells |
| | row_cells[0].text = "TOPLAM MALİYET" |
| | row_cells[1].text = str(data['toplam_maliyet']) |
| | |
| | |
| | for cell in row_cells: |
| | for paragraph in cell.paragraphs: |
| | for run in paragraph.runs: |
| | run.font.bold = True |
| | |
| | doc.add_paragraph() |
| | |
| | |
| | if 'kar_marji' in data and 'teklif_fiyati' in data: |
| | doc.add_paragraph("TEKLİF BİLGİLERİ", style='Alt Başlık') |
| | |
| | |
| | table = doc.add_table(rows=1, cols=2) |
| | table.style = 'Table Grid' |
| | |
| | |
| | header_cells = table.rows[0].cells |
| | header_cells[0].text = "Kalem" |
| | header_cells[1].text = "Değer" |
| | |
| | |
| | for cell in header_cells: |
| | for paragraph in cell.paragraphs: |
| | for run in paragraph.runs: |
| | run.font.bold = True |
| | |
| | |
| | row_cells = table.add_row().cells |
| | row_cells[0].text = "Toplam Maliyet (TL)" |
| | row_cells[1].text = str(data['toplam_maliyet']) |
| | |
| | |
| | row_cells = table.add_row().cells |
| | row_cells[0].text = "Kar Marjı (%)" |
| | row_cells[1].text = str(data['kar_marji']) |
| | |
| | |
| | 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']) |
| | |
| | |
| | row_cells = table.add_row().cells |
| | row_cells[0].text = "TEKLİF FİYATI (TL)" |
| | row_cells[1].text = str(data['teklif_fiyati']) |
| | |
| | |
| | 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 |
| | """ |
| | |
| | heading = doc.add_paragraph("TEKLİF", style='Başlık') |
| | heading.alignment = WD_ALIGN_PARAGRAPH.CENTER |
| | |
| | |
| | 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() |
| | |
| | |
| | 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() |
| | |
| | |
| | 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() |
| | |
| | |
| | if 'teklif_detaylari' in data: |
| | doc.add_paragraph("TEKLİF DETAYLARI", style='Alt Başlık') |
| | |
| | |
| | table = doc.add_table(rows=1, cols=5) |
| | table.style = 'Table Grid' |
| | |
| | |
| | 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)" |
| | |
| | |
| | for cell in header_cells: |
| | for paragraph in cell.paragraphs: |
| | for run in paragraph.runs: |
| | run.font.bold = True |
| | |
| | |
| | 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)) |
| | |
| | |
| | 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']) |
| | |
| | |
| | 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() |
| | |
| | |
| | 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() |
| | |
| | |
| | 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() |
| | |
| | |
| | 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 |
| | """ |
| | |
| | heading = doc.add_paragraph(data.get('baslik', 'DOKÜMAN'), style='Başlık') |
| | heading.alignment = WD_ALIGN_PARAGRAPH.CENTER |
| | |
| | |
| | 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() |
| | |
| | |
| | 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() |
| | |
| | |
| | if template_type == 'maliyet_raporu': |
| | _create_cost_report_excel(wb, data) |
| | elif template_type == 'teklif': |
| | _create_offer_excel(wb, data) |
| | else: |
| | |
| | _create_default_excel(wb, data) |
| | |
| | |
| | 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 |
| | """ |
| | |
| | if 'Sheet' in wb.sheetnames: |
| | del wb['Sheet'] |
| | |
| | |
| | ws_summary = wb.create_sheet("Özet") |
| | ws_labor = wb.create_sheet("İşçilik Maliyetleri") |
| | ws_material = wb.create_sheet("Malzeme Maliyetleri") |
| | |
| | |
| | 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') |
| | ) |
| | |
| | |
| | ws_summary.column_dimensions['A'].width = 30 |
| | ws_summary.column_dimensions['B'].width = 15 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | ws_summary[f'A{row}'] = "TOPLAM MALİYET" |
| | ws_summary[f'A{row}'].font = header_font |
| | row += 1 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | """ |
| | |
| | if 'Sheet' in wb.sheetnames: |
| | del wb['Sheet'] |
| | |
| | |
| | ws_offer = wb.create_sheet("Teklif") |
| | ws_details = wb.create_sheet("Detaylar") |
| | |
| | |
| | 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') |
| | ) |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | if 'teklif_detaylari' in data: |
| | ws_offer[f'A{row}'] = "TEKLİF DETAYLARI" |
| | ws_offer[f'A{row}'].font = header_font |
| | row += 1 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | ws_details.column_dimensions['A'].width = 30 |
| | ws_details.column_dimensions['B'].width = 50 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | |
| | |
| | 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 |
| | """ |
| | |
| | ws = wb.active |
| | ws.title = "Doküman" |
| | |
| | |
| | header_font = Font(name='Arial', size=12, bold=True) |
| | normal_font = Font(name='Arial', size=11) |
| | |
| | center_align = Alignment(horizontal='center', vertical='center') |
| | |
| | |
| | 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 |
| | |
| | |
| | ws['D2'] = "Tarih:" |
| | ws['E2'] = datetime.now().strftime('%d.%m.%Y') |
| | ws['D2'].font = normal_font |
| | ws['E2'].font = normal_font |
| | |
| | |
| | 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 |