diff --git a/ulakbus/diagrams/bap_satin_alma_islemleri.bpmn b/ulakbus/diagrams/bap_satin_alma_islemleri.bpmn index a5be9282..c83e7a4f 100644 --- a/ulakbus/diagrams/bap_satin_alma_islemleri.bpmn +++ b/ulakbus/diagrams/bap_satin_alma_islemleri.bpmn @@ -1,6 +1,7 @@ - + + Bütçe Kalemi Seç @@ -21,6 +22,7 @@ SequenceFlow_0he8yzo SequenceFlow_10vwch2 SequenceFlow_13vpeco + SequenceFlow_0pwlicm SequenceFlow_14v8dxy @@ -180,6 +182,7 @@ SequenceFlow_0y8eudw SequenceFlow_1kr1ya9 SequenceFlow_13l5qx4 + SequenceFlow_0eiwiku @@ -204,6 +207,7 @@ SequenceFlow_0wb428y + SequenceFlow_0svy1ih SequenceFlow_0hedib2 SequenceFlow_10vwch2 @@ -230,11 +234,45 @@ SequenceFlow_06cd6wz SequenceFlow_13vpeco + + + + + SequenceFlow_0eiwiku + SequenceFlow_1voaykx + + + SequenceFlow_1voaykx + SequenceFlow_0jonedk + SequenceFlow_0svy1ih + SequenceFlow_1s8km8k + + + + + + + + + + + + + + SequenceFlow_0jonedk + SequenceFlow_18voapg + SequenceFlow_0pwlicm + + + + SequenceFlow_1s8km8k + SequenceFlow_18voapg + - + @@ -580,10 +618,11 @@ - + + - + @@ -657,6 +696,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ulakbus/lib/doc_render/__init__.py b/ulakbus/lib/doc_render/__init__.py new file mode 100644 index 00000000..e6b41eb8 --- /dev/null +++ b/ulakbus/lib/doc_render/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2015 ZetaOps Inc. +# +# This file is licensed under the GNU General Public License v3 +# (GPLv3). See LICENSE.txt for details. + +from .bap_komisyon_toplanti_tutanagi import * +from .bap_muayene_ve_kabul_komisyon_tutanagi import * +from .bap_sozlesme import * +from .dogrudan_tek_kaynak import * +from .mal_ve_hizmet_alimlari_onay_belgesi import * +from .muayene_gorevlendirmesi import * +from .piyasa_fiyat_arastirmasi_tutanagi import * +from .siparis_formu import * +from .tasinir_islem_fisi import * diff --git a/ulakbus/lib/doc_render/bap_komisyon_toplanti_tutanagi.odt b/ulakbus/lib/doc_render/bap_komisyon_toplanti_tutanagi.odt new file mode 100644 index 00000000..6ee3aac4 Binary files /dev/null and b/ulakbus/lib/doc_render/bap_komisyon_toplanti_tutanagi.odt differ diff --git a/ulakbus/lib/doc_render/bap_komisyon_toplanti_tutanagi.py b/ulakbus/lib/doc_render/bap_komisyon_toplanti_tutanagi.py new file mode 100644 index 00000000..b7c4d9ff --- /dev/null +++ b/ulakbus/lib/doc_render/bap_komisyon_toplanti_tutanagi.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2015 ZetaOps Inc. +# +# This file is licensed under the GNU General Public License v3 +# (GPLv3). See LICENSE.txt for details. + +from ulakbus.lib.document import RenderDocument + + +def bap_komisyon_toplanti_tutanagi_uret(context_data, wants_pdf=False): + """ + BAP Komisyon toplantı tutanağı şablonu için kullanılabilir değişkenler: + + -> karar_tarihi + -> oturum_no + -> karar_no + -> kararlar : Karar metinleri liste halinde buraya gelir. + -> baskan : Toplantı başkanı adı + -> bap_koordinatoru : BAP Koordinatörü adı + -> uyeler : Toplamda 5 toplantı üyesi olmalı. 5 Zorunlu. + + + Args: + context_data (dict): + wants_pdf (Bool): + Returns: + str: URL + """ + template = "bap_komisyon_toplanti_tutanagi.odt" + rd = RenderDocument(template_name=template, + context=context_data, + wants_pdf=wants_pdf) + return rd.doc_url diff --git a/ulakbus/lib/doc_render/bap_muayene_ve_kabul_komisyon_tutanagi.odt b/ulakbus/lib/doc_render/bap_muayene_ve_kabul_komisyon_tutanagi.odt new file mode 100644 index 00000000..3e33da57 Binary files /dev/null and b/ulakbus/lib/doc_render/bap_muayene_ve_kabul_komisyon_tutanagi.odt differ diff --git a/ulakbus/lib/doc_render/bap_muayene_ve_kabul_komisyon_tutanagi.py b/ulakbus/lib/doc_render/bap_muayene_ve_kabul_komisyon_tutanagi.py new file mode 100644 index 00000000..ccd82d4e --- /dev/null +++ b/ulakbus/lib/doc_render/bap_muayene_ve_kabul_komisyon_tutanagi.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2015 ZetaOps Inc. +# +# This file is licensed under the GNU General Public License v3 +# (GPLv3). See LICENSE.txt for details. + +from ulakbus.lib.document import RenderDocument + +def bap_muayene_ve_kabul_komisyonu_tutanagi_uret(context_data, wants_pdf=False): + """ + BAP muayene ve kabul komisyonu tutanağı şablonu. + + Template içerisinde kullanabileceğiniz değişkenler: + + -> i_f_no : Tutanağın sağ üst köşesinde yer alan numara bilgisi. + -> nereden_geldigi : Taşnırın nereden geldiği. + -> dayandigi_belge_tarihi : + -> dayandigi_belge_sayisi : + -> muayene_kabul_komisyonu_tutanagi_tarihi: Belgenin oluşma tarihi. + + -> tasinirlar: + ### Aşağıdaki niteliklere sahip, dict veya object gönderilmeli. + --> miktari : + --> birimi : + --> adi_ve_ozellikleri : + + -> tasinir_sayisi : Toplam taşınır sayısı. Yani kaç kalem taşınır girildi. + -> baskan: + ### Aşağıdaki niteliklere sahip, dict veya object gönderilmeli. + --> adi : Başkanın adı, Someone. + --> unvan : Başkanın ünvanı, Proje Yürütücüsü, Öğretim Görevlisi vs. + -> uye1 : + ### Aşağıdaki niteliklere sahip, dict veya object gönderilmeli. + --> adi : Üyenin adı + --> unvan : Ünvanı + -> uye2 : + ### Aşağıdaki niteliklere sahip, dict veya object gönderilmeli. + --> adi : Üye adı. + --> unvan : Üyenin ünvanı. + + Args: + context_data (dict) : Context variables for template engine. + wants_pdf (Bool) : If client wants the output as PDF, pass True. + + Returns: + str : URL of rendered document. + + """ + template = "bap_muayene_ve_kabul_komisyon_tutanagi.odt" + rd = RenderDocument(template_name=template, + context=context_data, + wants_pdf=wants_pdf) + return rd.doc_url diff --git a/ulakbus/lib/doc_render/bap_sozlesme.odt b/ulakbus/lib/doc_render/bap_sozlesme.odt new file mode 100644 index 00000000..70313deb Binary files /dev/null and b/ulakbus/lib/doc_render/bap_sozlesme.odt differ diff --git a/ulakbus/lib/doc_render/bap_sozlesme.py b/ulakbus/lib/doc_render/bap_sozlesme.py new file mode 100644 index 00000000..264ff843 --- /dev/null +++ b/ulakbus/lib/doc_render/bap_sozlesme.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2015 ZetaOps Inc. +# +# This file is licensed under the GNU General Public License v3 +# (GPLv3). See LICENSE.txt for details. + +from ulakbus.lib.document import RenderDocument + + +def bap_sozlesme_uret(context_data, wants_pdf=False): + """ + BAP Sözleşme Şablonu + + Şablon içinde kullanabileceğiniz değişkenler: + -> proje_no : BAP proje numarası + -> proje_basligi : BAP proje başlığı + -> proje_yurutucusu : BAP proje yürütücüsü (x2 in Template) + -> proje_butcesi : BAP proje bütçesi + -> toplam_destek_tutari : Verilecek desteğin toplam değeri (TL) + -> sozlesme_imza_tarihi : Sözleşmenin imzalanma tarihi (x2 in Template) + -> bap_komisyon_baskani : BAP komisyon başkanının adı. + -> tuketim_malzemeleri : Proje için gerekecek olan malzemelerin listesi. + ### Aşağıdaki attributelara sahip bir dict veya object olmalı. + --> yil : Malzeme yılı + --> tur : Malzeme türü + --> gerekce : Malzeme kullanımı için gerekçe. + --> miktar : Malzemenin ne kadar olacağı. + --> birim_fiyat : Malzemenin birim fiyatı. + --> toplam_tutar : Malzemenin `miktar`ı ile `birim_fiyat`ının çarpımı. + + Args: + context_data (dict): Template içinde kullanılacak olan değişkenler. + wants_pdf (Bool) : Output olarak PDF isteniyorsa, True olmalı. + + Returns: + str: Üretilmiş olan dökümanın, URL adresi. + + """ + + template = "bap_sozlesme.odt" + rd = RenderDocument(template_name=template, + context=context_data, + wants_pdf=wants_pdf) + return rd.doc_url diff --git a/ulakbus/lib/doc_render/dogrudan_tek_kaynak.odt b/ulakbus/lib/doc_render/dogrudan_tek_kaynak.odt new file mode 100644 index 00000000..257ebe50 Binary files /dev/null and b/ulakbus/lib/doc_render/dogrudan_tek_kaynak.odt differ diff --git a/ulakbus/lib/doc_render/dogrudan_tek_kaynak.py b/ulakbus/lib/doc_render/dogrudan_tek_kaynak.py new file mode 100644 index 00000000..38cf28ef --- /dev/null +++ b/ulakbus/lib/doc_render/dogrudan_tek_kaynak.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2015 ZetaOps Inc. +# +# This file is licensed under the GNU General Public License v3 +# (GPLv3). See LICENSE.txt for details. + +from ulakbus.lib.document import RenderDocument + + +def dogrudan_tek_kaynak_uret(context_data, wants_pdf=False): + """ + Doğrudan tek kaynak template. + + Kullanılabilir değişkenler : + -> idare : Hangi daire hazırlıyor, BAP vs. + -> alim_yapan_birim : + + -> ongorulen_teslim_zamani : + -> ongorulen_yaklasik_bedel: + -> satici_unvan : + -> satici_tebligat_adresi : + + -> satici_vergi_dairesi_ve_numarasi: + -> satici_telefon_ve_faks_numarasi : + -> satici_eposta_adresi : + -> satici_ilgili_kisi : + + -> ihtiyac_konusu_malin_nitelikleri: + -> alimin_hangi_kapsamda_yapildigi : + + -> alim_maddesi : Alım maddesi, 21-a,b,c bendine göre bir işeretleme şeklidir. + Applied filters on alim_maddesi : string(), lower() (a, b, c) + Örnek : a,b,c,A,B,C,"a" vs. + -> ihale_yetkilisi : + ### Aşağıdaki attributelara sahip bir dict veya object olmalı. + -> ad : + -> gorev : + Args: + context_data (dict): + wants_pdf (bool): + Returns: + str: URL + """ + template = "dogrudan_tek_kaynak.odt" + rd = RenderDocument(template_name=template, + context=context_data, + wants_pdf=wants_pdf) + return rd.doc_url diff --git a/ulakbus/lib/doc_render/mal_ve_hizmet_alimlari_onay_belgesi.odt b/ulakbus/lib/doc_render/mal_ve_hizmet_alimlari_onay_belgesi.odt new file mode 100644 index 00000000..bb033cbe Binary files /dev/null and b/ulakbus/lib/doc_render/mal_ve_hizmet_alimlari_onay_belgesi.odt differ diff --git a/ulakbus/lib/doc_render/mal_ve_hizmet_alimlari_onay_belgesi.py b/ulakbus/lib/doc_render/mal_ve_hizmet_alimlari_onay_belgesi.py new file mode 100644 index 00000000..e98bc60f --- /dev/null +++ b/ulakbus/lib/doc_render/mal_ve_hizmet_alimlari_onay_belgesi.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2015 ZetaOps Inc. +# +# This file is licensed under the GNU General Public License v3 +# (GPLv3). See LICENSE.txt for details. + +from ulakbus.lib.document import RenderDocument + + +def mal_ve_hizmet_alimlari_onay_belgesi_uret(context_data, wants_pdf=False): + """ + Mal ve hizmet alımları onay belgesi template değişkenleri: + + -> i_f_no : Belgenin sağ üst köşesinde yer alan bir numara. + -> alimi_yapan_idare_adi : + -> belge_tarih_ve_sayisi : + -> isin_tanimi : + -> isin_niteligi : + -> isin_miktari : + -> yaklasik_maliyet : + -> kullanilabilir_odenek_tutari: + -> proje_numarasi : + -> butce_tertibi : + -> alim_usulu : Alım usulü veya şekli. + # Bundan sonraki degerler örnek dökümanda çok basit cevaplanmış. + # Yoktur, düzenlenmeyecektir, verilmeyecektir gibi. + -> avans_verilme_sartlari : + -> ilanin_sekli_ve_adedi : + -> sartname_duzenlemesi : + -> sozlesme_duzenlemesi : + + -> alim_ile_ilgili_aciklama : Alım yapan kişinin ve neden alım yapıldığı. + -> arastirma_gorevlileri : Piyasa araştırması yapmakla görevli araştırmacı personel. + ### Bu bir list olmalıdır ve sadece isimleri yer almalıdır. + ### Örnek kullanım : for gorevli in arastirma_gorevlileri: print (gorevli) + + -> belge_imza_tarihi : İmzanın atıldıgı kısımda yer alır. + -> gorevli : + ### Aşağıdaki attributelara sahip bir dict veya object olmalı. + --> ad : Görevli adı. + --> unvan : Görevlinin unvanı. Project Executor vs. + -> ihale_yetkilisi : + ### Aşağıdaki attributelara sahip bir dict veya object olmalı. + --> ad : İhale yetkilisi ad. + --> unvan : Ünvanı + + Args: + context_data (dict): Template içinde kullanılacak olan değişkenler. + wants_pdf (Bool) : Output olarak PDF isteniyorsa, True olmalı. + + Returns: + str: Üretilmiş olan dökümanın, URL adresi. + """ + template = "mal_ve_hizmet_alimlari_onay_belgesi.odt" + rd = RenderDocument(template_name=template, + context=context_data, + wants_pdf=wants_pdf) + return rd.doc_url diff --git a/ulakbus/lib/doc_render/muayene_gorevlendirmesi.odt b/ulakbus/lib/doc_render/muayene_gorevlendirmesi.odt new file mode 100644 index 00000000..54127cec Binary files /dev/null and b/ulakbus/lib/doc_render/muayene_gorevlendirmesi.odt differ diff --git a/ulakbus/lib/doc_render/muayene_gorevlendirmesi.py b/ulakbus/lib/doc_render/muayene_gorevlendirmesi.py new file mode 100644 index 00000000..0a6c51c8 --- /dev/null +++ b/ulakbus/lib/doc_render/muayene_gorevlendirmesi.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2015 ZetaOps Inc. +# +# This file is licensed under the GNU General Public License v3 +# (GPLv3). See LICENSE.txt for details. + +from ulakbus.lib.document import RenderDocument + + +def muayene_gorevlendirmesi_uret(context_data, wants_pdf=False): + """ + Muayene görevlendirmesi dilekçe şablonu üretir. + + Template içerisinde kullanabileceğiniz değişkenler: + + -> dilekce_sayisi : + -> dilekce_tarihi : Oluşturulma tarihi. (x2 in Template) + + -> gerceklestirme_gorevlisi : + ### Aşağıdaki niteliklere sahip, dict veya object gönderilmeli. + --> ad : + --> unvan : + -> harcama_yetkilisi : + ### Aşağıdaki niteliklere sahip, dict veya object gönderilmeli. + --> ad : + --> unvan : + + -> muayene_komisyonu_idari_uzman : Görevlendirilecek kişinin adı. + -> muayene_komisyonu_teknik_uzman : + -> muayene_komisyonu_ambar_gorevlisi : + + Args: + context_data (dict) : Variables for template engine. + wants_pdf (Bool) : Output as PDF? + Returns: + str: URL + """ + template = "muayene_gorevlendirmesi.odt" + rd = RenderDocument(template_name=template, + context=context_data, + wants_pdf=wants_pdf) + return rd.doc_url diff --git a/ulakbus/lib/doc_render/piyasa_fiyat_arastirmasi_tutanagi.odt b/ulakbus/lib/doc_render/piyasa_fiyat_arastirmasi_tutanagi.odt new file mode 100644 index 00000000..1b6c82bb Binary files /dev/null and b/ulakbus/lib/doc_render/piyasa_fiyat_arastirmasi_tutanagi.odt differ diff --git a/ulakbus/lib/doc_render/piyasa_fiyat_arastirmasi_tutanagi.py b/ulakbus/lib/doc_render/piyasa_fiyat_arastirmasi_tutanagi.py new file mode 100644 index 00000000..f6e3f706 --- /dev/null +++ b/ulakbus/lib/doc_render/piyasa_fiyat_arastirmasi_tutanagi.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2015 ZetaOps Inc. +# +# This file is licensed under the GNU General Public License v3 +# (GPLv3). See LICENSE.txt for details. + +from ulakbus.lib.document import RenderDocument + + +def piyasa_fiyat_arastirmasi_tutanagi_uret(context_data, wants_pdf=False): + """ + Piyasa fiyat araştırması tutanağı şablonu. + + !!! Verilerin sıralı olmasına dikkat ediniz.... + + -> idare_adi : + -> yapilan_isin_adi : + -> alim_yapan_gorevlilere_iliskin : + -> ihale_onay_belgesi_tarih_sayi : + + -> firmalar : + ### Bu bir liste olmalı. 3 Elemanlı. Yani 3 Firma olabilir. Eksik yazmayın! + + -> malzemeler : + ### Aşağıdaki attributelara sahip bir dict veya object olmalı. + --> sira_no : + --> adi : + --> miktar : + --> birim : + + --> f1_birim : Şirket 1 'in vermiş olduğu birim fiyat. + --> f1_toplam : Şirket 1 'in vermiş olduğu toplam fiyat. Birim * Adet. + + --> f2_birim : Şirket 2'nin vermiş olduğu birim fiyat. + --> f2_toplam : Şirket 2'nin vermiş olduğu toplam fiyat. Birim * Adet. + + --> f3_birim : Şirket 3 için. + --> f3_toplam : Şirket 3 için. Birim * Adet. Max. 3 şirket olabilir. + + -> f1_genel_toplam : Firma 1'in teklifinin genel toplamı. + -> f2_genel_toplam : Firma 2'nin teklifinin genel toplamı. + -> f3_genel_toplam + + -> malzeme_sayisi : Kaç kalem malzeme alındığı bilgisi. + -> uygun_gorulen_firma_adi_adresi : İhaleyi kazanan, firma bilgisi. + -> uygun_gorulen_teklif_tutari : İhaleyi ne kadar ile kazandı. + + -> gorevli : + ### Bu bir liste olmalı. Liste elemanları dict ile şunları içermeli. + --> ad : Görevlinin adı + --> unvan : Görevlinin ünvanı + # Örnek erişim >>> gorevli[0].ad + -> harcama_yetkilisi : + ### Aşağıdaki attributelara sahip bir dict veya object olmalı. + --> ad : Harcama yetkilisinin adı + --> unvan : Ünvanı. BAP Koordinatorü vs. + -> belge_imza_tarihi : Belgenin imzalanma tarihi. En altta yer alıyor. + + Args: + context_data (dict): Context data + wants_pdf (Bool): + Returns: + str: URL rendered doc. + """ + template = "piyasa_fiyat_arastirmasi_tutanagi.odt" + rd = RenderDocument(template_name=template, + context=context_data, + wants_pdf=wants_pdf) + return rd.doc_url diff --git a/ulakbus/lib/doc_render/siparis_formu.odt b/ulakbus/lib/doc_render/siparis_formu.odt new file mode 100644 index 00000000..9aa07b2a Binary files /dev/null and b/ulakbus/lib/doc_render/siparis_formu.odt differ diff --git a/ulakbus/lib/doc_render/siparis_formu.py b/ulakbus/lib/doc_render/siparis_formu.py new file mode 100644 index 00000000..d7938bae --- /dev/null +++ b/ulakbus/lib/doc_render/siparis_formu.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2015 ZetaOps Inc. +# +# This file is licensed under the GNU General Public License v3 +# (GPLv3). See LICENSE.txt for details. + +from ulakbus.lib.document import RenderDocument +import datetime + + +def siparis_formu_uret(context_data, wants_pdf=False): + """ + Sipariş formu için gerekli context data. + + -> isin_niteligi : + -> butce_tertibi : + -> isin_adi_veya_miktari : + -> malzemeler : 1..* + ### Aşağıdaki attributelara sahip bir dict veya object olmalı. + --> sira_no : + --> adi : + --> miktar : + --> birim : + + -> yuklenici_firma_adi : (x2 in Template) + -> tebligata_esas_adresi : + -> siparis_bedeli : + -> odeme_saymanligi : + -> vergi_resim_ve_harclar: + -> garanti_suresi_ve_sartlar: + -> yedek_parca_montaj_sartlari: + -> teslim_suresi : + -> belge_yili : Bulunulan yıl, 2017. (x3 in Template) + -> gerceklestirme_gorevlisi : + ### Aşağıdaki attributelara sahip bir dict veya object olmalı. + --> ad : Kişi adı, Prof. Someone + --> unvan: Proje yürütücüsü, BAP Koordinatörü vs.vs. + -> harcama_yetkilisi : + ### Aşağıdaki attributelara sahip bir dict veya object olmalı. + --> ad : Kişi adı, Prof Someone + --> unvan: BAP koordinatörü vs.vs. + + Args: + context_data (dict): Context variables for template engine. + wants_pdf (Bool): Output as PDF ? + Returns: + str: URL of produced document. + """ + # Set current year. + context_data['belge_yili'] = datetime.datetime.now().year + template = "siparis_formu.odt" + + rd = RenderDocument(template_name=template, + context=context_data, + wants_pdf=wants_pdf) + return rd.doc_url diff --git a/ulakbus/lib/doc_render/tasinir_islem_fisi.odt b/ulakbus/lib/doc_render/tasinir_islem_fisi.odt new file mode 100644 index 00000000..61dd2a51 Binary files /dev/null and b/ulakbus/lib/doc_render/tasinir_islem_fisi.odt differ diff --git a/ulakbus/lib/doc_render/tasinir_islem_fisi.py b/ulakbus/lib/doc_render/tasinir_islem_fisi.py new file mode 100644 index 00000000..25c07693 --- /dev/null +++ b/ulakbus/lib/doc_render/tasinir_islem_fisi.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- + +# Copyright (C) 2015 ZetaOps Inc. +# +# This file is licensed under the GNU General Public License v3 +# (GPLv3). See LICENSE.txt for details. + +from ulakbus.lib.document import RenderDocument + + +def tasinir_islem_fisi_uret(context_data, wants_pdf=False): + """ + Taşınır işlem fişi Şablonu + + Şablon içerisinde kullanabileceğiniz değişkenler: + + -> fis_sira_no : Fişin defterdeki sıra numarası, 2017/122 + -> tahakkuk_no : Fişin tahakkuk numarası, + -> fis_tarihi : Fişin oluşturulma tarihi. (x2 in Template) + + -> il_ilce_adi : İl, ilçe adı. + -> il_ilce_kodu : İlin kodu, (06 mesela.) + -> harcama_birimi_adi : + -> harcama_birimi_kodu : + -> muhasebe_birimi_adi : + -> muhasebe_birimi_kodu : + + -> kabul_komisyonu_tutanagi_tarihi : + -> kabul_komisyonu_tutanagi_sayisi : + -> dayanagi_belgenin_tarihi : Dayanağı olan belgenin tarihi. + -> dayanagi_belgenin_sayisi : + + -> islem_cesidi : Yapılan işlem, (Ör: BAP Satın Alma) + -> nereden_geldigi : + -> kime_verildigi : + -> nereye_verildigi : + + -> gonderilen_harcama_adi : Gönderilen birim hakkında. + -> gonderilen_harcama_kodu : + -> gonderilen_tasinir_ambari_adi : + -> gonderilen_tasinir_ambari_kodu : + -> gonderilen_muhasebe_biriminin_adi : + -> gonderilen_muhasebe_biriminin_kodu : + + -> tasinirlar : + ### Aşağıdaki niteliklere sahip, dict veya object gönderilmeli. + --> sira_no : + --> kodu : + --> sicil_no : + --> adi : + --> ambar_kodu : + --> olcu_birimi : + --> birim_fiyat : + --> miktari : + --> tutari : + + -> genel_bilgilendirme_kod : Toplam yazılmadan önce alınan taşınır hakkında bilgi. + -> genel_bilgilendirme_adi : + -> genel_bilgilendirme_tutari : + + -> genel_toplam : + -> tif_kurus_farki : + + -> kalem_girdi_sayisi : (x2 in Template) + -> tasinir_girdi_sayisi : (x2 in Template) + -> tasinir_kayit_yetkilisi_ad : + -> tasinir_kayit_yetkilisi_unvan : + -> teslim_eden_ad : + -> teslim_eden_unvani : + + Args: + context_data (dict) : Context variables for template engine. + wants_pdf (Bool) : Output as PDF? + Returns: + str : URL + """ + template = "tasinir_islem_fisi.odt" + rd = RenderDocument(template=template, + context=context_data, + wants_pdf=wants_pdf) + return rd.doc_url diff --git a/ulakbus/lib/document.py b/ulakbus/lib/document.py index fc4208db..329fc5df 100644 --- a/ulakbus/lib/document.py +++ b/ulakbus/lib/document.py @@ -47,7 +47,7 @@ def _get_template(self): """ try: t = Template.objects.get(name=self.file_name) - return {"template": "{}{}".format(settings.S3_PUBLIC_URL, t.template), + return {"template": "{}/{}".format(settings.S3_PUBLIC_URL, t.template), "modify_date": "{}".format(t.modify_date)} except ObjectDoesNotExist: raise ValueError("%s geçerli bir template değildir. " @@ -64,7 +64,7 @@ def render(self): payload = {"template": template_info['template'], "context": self.context, - "wants_pdf": self.wants_pdf, + "pdf": self.wants_pdf, "modify_date": template_info['modify_date'] } diff --git a/ulakbus/models/bap/bap.py b/ulakbus/models/bap/bap.py index ed18b6a2..8fabe91d 100644 --- a/ulakbus/models/bap/bap.py +++ b/ulakbus/models/bap/bap.py @@ -8,10 +8,17 @@ from ulakbus.models import Room, Personel, Role, User from ulakbus.models.demirbas import Demirbas from pyoko.lib.utils import lazy_property + from zengine.lib.translation import gettext_lazy as __, gettext as _ + from pyoko import Model, field, ListNode from pyoko.exceptions import ObjectDoesNotExist +talep_durum = [(1, 'Yeni'), + (2, 'Silinecek'), + (3, 'Düzenlendi'), + (4, 'Düzenlenmedi')] + class BAPProjeTurleri(Model): kod = field.String(__(u"Proje tür kodu")) @@ -446,31 +453,29 @@ class Meta: verbose_name = __(u"Gündem") verbose_name_plural = __(u"Gündemler") list_fields = ['_proje_adi', '_proje_yurutucusu', 'gundem_tipi', 'oturum_numarasi', - 'oturum_tarihi', 'karar_no'] + 'oturum_tarihi', 'karar_no', 'karar_tarihi'] proje = BAPProje() etkinlik = BAPEtkinlikProje() - gundem_tipi = field.Integer(__(u"Gündem Tipi"), choices='bap_komisyon_gundemleri', default=1) - gundem_aciklama = field.Text(__(u"Gündem Açıklaması"), required=False) - oturum_numarasi = field.String(__(u"Oturum Numarası"), default="", required=False) - oturum_tarihi = field.Date(__(u"Oturum Tarihi"),required=False) - karar_no = field.String(__(u"Karar No"), default="", required=False) - karar = field.String(__(u"Karar"), default="", required=False) + gundem_tipi = field.String(__(u"Gündem Tipi"), choices='bap_komisyon_gundemleri', default=1) + gundem_aciklama = field.Text(__(u"Gündem Açıklaması")) + oturum_numarasi = field.String(__(u"Oturum Numarası")) + oturum_tarihi = field.Date(__(u"Oturum Tarihi")) + karar_no = field.String(__(u"Karar No")) + karar_tarihi = field.Date(__(u"Karar Tarihi")) sonuclandi = field.Boolean(__(u"Kararın Sonuçlandırılması"), default=False) - karar_metni = field.Text(__(u"Karar Metni"), required=False) + karar_metni = field.Text(__(u"Karar Metni")) karar_gerekcesi = field.Text( - __(u"Karar Gerekçesi (Reddetme ve revizyon kararlarında gerekçe belirtilmelidir.)"), - required=False) + __(u"Karar Gerekçesi (Reddetme ve revizyon kararlarında gerekçe belirtilmelidir.)")) gundem_ekstra_bilgiler = field.String(__(u"Gündem Ekstra Bilgileri"), hidden=True) def _proje_adi(self): - return "Diğer" if self.gundem_tipi == 10 else "%s" % self.proje.ad if self.proje.key else \ - self.etkinlik.bildiri_basligi + return "%s" % self.proje.ad if self.proje.key else self.etkinlik.bildiri_basligi _proje_adi.title = __(u"Projenin Adı") def _proje_yurutucusu(self): - return "Diğer" if self.gundem_tipi == 10 else "%s %s" % ( + return "%s %s" % ( (self.proje.yurutucu.ad, self.proje.yurutucu.soyad) if self.proje.key else ( self.etkinlik.basvuru_yapan.ad, self.etkinlik.basvuru_yapan.soyad)) @@ -586,9 +591,9 @@ def __unicode__(self): @classmethod def en_iyi_teklif_veren_ikinci_ve_ucuncu_firmayi_getir(cls, butce): firmalar = cls.objects.filter(kalem=butce).exclude(firma=butce.kazanan_firma).order_by( - '-toplam_fiyat') + 'toplam_fiyat') - return firmalar[0], firmalar[1] + return firmalar[0].firma, firmalar[1].firma class BAPRapor(Model): @@ -598,8 +603,8 @@ class Meta: proje = BAPProje() tur = field.Integer(__(u"Rapor Türü"), choices='bap_rapor_turu') - durum = field.Integer(__(u"Rapor Durumu"), choices='bap_rapor_durum', default=1) - belge = field.File(_(u"Proje Rapor Belgesi"), random_name=True) + durum = field.Integer(__(u"Rapor Durumu"), choices='bap_rapor_durum') + belge = field.File(_(u"Proje Rapor Belgesi"), random_name=False) def __unicode__(self): return "%s-%s" % (self.proje.ad, self.get_tur_display()) diff --git a/ulakbus/services/common/document_render.py b/ulakbus/services/common/document_render.py index 2514d3c5..4619ad7f 100644 --- a/ulakbus/services/common/document_render.py +++ b/ulakbus/services/common/document_render.py @@ -66,7 +66,7 @@ def handle(self): self.S3_BUCKET_NAME = self.user_config.zetaops.zetaops3s.S3_BUCKET_NAME self.wants_pdf = self.request.payload.get('pdf', False) - + self.logger.info("WANTS PDF : {} ".format(self.wants_pdf)) self.document_cache = DocumentCache(payload=self.request.payload, kvdb_conn=self.kvdb.conn, wants_pdf=self.wants_pdf, @@ -81,16 +81,26 @@ def handle(self): else: # `cache_stat` can be context_value or template_value. value = self.get_value_from_cache(cache_stat=cache_stat) + # `value` is a dict. # if `value` is `template`. Use content of `template` on Redis. - if value == self.document_cache.template: + if value['mimetype'] == "template": self.logger.info("NO NEED TO DOWNLOAD TEMPLATE") new_payload = self.create_new_payload() resp = self.standard_process(payload=new_payload) else: - self.logger.info("NO ACTION WASN'T REQUIRED, SENDED URL") - resp = self.prepare_response('ok', value) + self.logger.info("ACTIONS TO DO : ") + if value['mimetype'] == "odt" and self.wants_pdf is True: + self.logger.info("DOWNLOAD ODT and CONVERT to PDF") + # Download odt and convert to PDF + file_object = self.make_file_like_object(value['value'], download_token=1) + pdf_resp = self.create_pdf(file_object) + # ADD to cache PDF URL. + self.document_cache.add_rendered_pdf_doc(pdf_url=pdf_resp['download_url']) + value['value'] = pdf_resp['download_url'] + + resp = self.prepare_response('ok', value['value']) self.response.status_code = 200 self.response.payload = resp @@ -111,8 +121,7 @@ def get_value_from_cache(self, cache_stat): Args: cache_stat (dict): Redis value. Returns: - str: URL - dict: `template` value on Redis. + dict: Formatted dict data. """ def check_is_none(url, cache_stat): """ @@ -130,11 +139,21 @@ def check_is_none(url, cache_stat): else: return url_val - if self.wants_pdf: - return check_is_none('pdf_url', cache_stat) + pdf_value = check_is_none('pdf_url', cache_stat) + odt_value = check_is_none('odt_url', cache_stat) + # `odt_value` is equal `template`, return template. + if odt_value is self.document_cache.template: + return {"mimetype": "template", "value": odt_value} + # That means `odt_value` is equal the URL. else: - return check_is_none('odt_url', cache_stat) + # Client wants pdf. + if self.wants_pdf is True: + # `pdf_value` is not equal to `template` + if pdf_value is not self.document_cache.template: + return {"mimetype": "pdf", "value": pdf_value} + + return {"mimetype": "odt", "value": odt_value} def standard_process(self, payload): """ @@ -153,6 +172,7 @@ def standard_process(self, payload): file_desc = self.make_file_like_object(resp.data['download_url'], download_token=1) pdf_resp = self.create_pdf(file_desc) self.document_cache.add_rendered_pdf_doc(pdf_url=pdf_resp['download_url']) + self.logger.info("PDF RESPONSE : {}".format(pdf_resp['status'])) resp = self.prepare_response(pdf_resp['status'], pdf_resp['download_url']) else: resp = self.prepare_response('ok', resp.data['download_url']) @@ -201,7 +221,7 @@ def create_pdf(self, file_desc): task_id = task_info['id'].encode('utf-8') # Chect the queue for 3 seconds. - task_queue_status = self.check_the_status(request_period=3, + task_queue_status = self.check_the_status(request_period=8, task_id=task_id) # Send back to client if task_queue_status['status'] == 'finished': @@ -210,6 +230,7 @@ def create_pdf(self, file_desc): # Save PDF file to S3 Server s3_url = self.save_document(pdf_file) task_queue_status['download_url'] = "{0}{1}".format(self.S3_PUBLIC_URL, s3_url) + task_queue_status['status'] = 'ok' return task_queue_status else: return {"status": "error", "download_url": "None"} @@ -434,8 +455,8 @@ def check_the_cache(self): if self.is_template_newest(): self.template = self.template_value - if self.template: - if self.context_value and self.context_and_template_compatible(): + if self.template is not None: + if self.context_value is not None and self.context_and_template_compatible(): return self.context_value return self.template @@ -505,7 +526,6 @@ def add_rendered_pdf_doc(self, pdf_url): context_value = self.get_value(self.context_key) if context_value is not None: - self.logger.info("PDF URL ADDING TO REDIS") context_value['pdf_url'] = pdf_url self.set_value(self.context_key, context_value) diff --git a/ulakbus/views/bap/bap_satin_alma_islemleri.py b/ulakbus/views/bap/bap_satin_alma_islemleri.py index 4b7b5de6..fd0c5a9e 100644 --- a/ulakbus/views/bap/bap_satin_alma_islemleri.py +++ b/ulakbus/views/bap/bap_satin_alma_islemleri.py @@ -11,6 +11,7 @@ from ulakbus.lib.s3_file_manager import S3FileManager from datetime import datetime, time from ulakbus.settings import DATETIME_DEFAULT_FORMAT +import ulakbus.lib.doc_render as render class KazananFirmalarForm(JsonForm): @@ -18,7 +19,6 @@ class KazananFirmalarForm(JsonForm): Bütçe kalemleri için kazanan firmaların belirlenmesi formunu oluşturur. """ - class Meta: inline_edit = ['firma'] title = __(u"{} İçin Kazanan Firmaların Belirlenmesi") @@ -138,6 +138,26 @@ class Meta: geri_don = fields.Button(__(u"Geri Dön"), cmd="geri_don") +class ButceKalemiSec(JsonForm): + class Meta: + title = _(u"Bütçe Kalemi Seç") + + fields.Button(__(u"Go")) + + +class TemplateSecForm(JsonForm): + class Meta: + title = _(u"Belge İndir") + + belge = fields.String(__(u"Belge Adı"), + choices=[('piyasa_fiyat_arastirmasi_tutanagi', 'Piyasa Fiyat Araştırması Tutanağı'), + ('siparis_formu', 'Sipariş Formu'), + ('muayene_gorevlendirmesi', 'Muayene Görevlendirmesi'), + ('bap_muayene_ve_kabul_komisyon_tutanagi', 'BAP Muayene ve Kabul Komisyon Tutanağı')]) + geri_don = fields.Button(__(u"Geri Dön"), cmd="geri_don") + indir = fields.Button(__(u"İndir"), cmd="template_indir") + + class TeklifDegerlendirme(CrudView): """ Seçilen satın alma duyurusuna yapılmış tekliflerin değerlendirildiği view. @@ -443,6 +463,238 @@ def degisiklikleri_kaydet(self): self.object.aciklama = self.input['form']['aciklama'] self.object.save() + def butce_kalemi_sec(self): + """ + Something. + Returns: + + """ + satin_alma_object = self.model_class.objects.get(self.current.task_data['object_id']) + butce_kalemleri = satin_alma_object.ButceKalemleri + + self.output['objects'] = [[_(u'Bütçe Kalemi'), + _(u'Adet'), + _(u'Birim Fiyat'), + _(u'Toplam Fiyat'), + _(u'Gerekçe'), + _(u'Kazanan Firma')]] + for butce_kalemi in butce_kalemleri: + name, cmd = (_(u'Seç'), 'sec') + list_item = { + "fields": [butce_kalemi.butce.ad, + str(butce_kalemi.butce.adet), + str(butce_kalemi.butce.birim_fiyat), + str(butce_kalemi.butce.toplam_fiyat), + butce_kalemi.butce.gerekce, + butce_kalemi.butce.kazanan_firma.ad], + "actions": [ + {'name': name, 'cmd': cmd, 'show_as': 'button', 'object_key': 'data_key'} + ], + 'key': butce_kalemi.butce.key} + + self.output['objects'].append(list_item) + + """form = TeklifGorForm(current=self.current) + form.title = form.title.format(self.object.ad) + self.form_out(form)""" + + form = ButceKalemiSec(current=self.current) + self.form_out(form) + + def template_sec(self): + """ + DocumentRender servisine gönderilecek belgenin seçilmesi ve belgenin oluşturulup, indirilmesi. + + """ + form = TemplateSecForm() + self.form_out(form) + + def template_indir(self): + """ + Template seçimine göre, `render_function_map` dict'inden `render` ve `context` fonksiyonları elde edilir. + Sonuç olarak bunları çalıştırdığımızda elimizde render edilmiş bir template'in URL'i olur. + + """ + template_name = self.current.task_data.get('TemplateSecForm').get('belge') + + render_function_map = {'piyasa_fiyat_arastirmasi_tutanagi': + [render.piyasa_fiyat_arastirmasi_tutanagi_uret, + self.piyasa_fiyat_arastirmasi_tutanagi_context, + False], + 'siparis_formu': + [render.siparis_formu_uret, + self.siparis_formu_context, + False], + 'muayene_gorevlendirmesi': + [render.muayene_gorevlendirmesi_uret, + self.muayene_gorevlendirmesi_context, + False], + 'bap_muayene_ve_kabul_komisyon_tutanagi': + [render.bap_muayene_ve_kabul_komisyonu_tutanagi_uret, + self.bap_muayene_ve_kabul_komisyon_tutanagi, + False]} + + render_function, context_function, wants_pdf = render_function_map[template_name] + + self.set_client_cmd('download') + self.current.output['download_url'] = render_function(context_data=context_function(), + wants_pdf=wants_pdf) + + def piyasa_fiyat_arastirmasi_tutanagi_context(self): + """ + Piyasa fiyat araştırması tutanagı için gerekli verileri veritabanından okuyarak, context datası oluşturur. + Returns: + dict: Context data for template file. + + """ + satin_alma_object = self.model_class.objects.get(self.current.task_data['object_id']) + malzemeler = satin_alma_object.ButceKalemleri + + kazanan_firma = malzemeler[0].butce.kazanan_firma + firma2, firma3 = BAPTeklifFiyatIsleme.en_iyi_teklif_veren_ikinci_ve_ucuncu_firmayi_getir(malzemeler[0].butce) + + rightnow = datetime.now() + formatted_date = datetime.strftime(rightnow, '%d.%m.%Y') + + context = { + "idare_adi": "YILDIRIM BEYAZIT ÜNİVERSİTESİ REKTÖRLÜĞÜ BİLİMSEL ARAŞTIRMA PROJELERİ KOORDİNASYON BİRİMİ", + "yapilan_isin_adi": "Mal Alımı, Malzeme Alımı", + "alim_yapan_gorevlilere_iliskin": "", + "ihale_onay_belgesi_tarih_sayi": satin_alma_object.onay_tarih_sayi, + "malzemeler": [], + "firmalar": [kazanan_firma.ad, + firma2.ad, + firma3.ad], + "f1_genel_toplam": 0, + "f2_genel_toplam": 0, + "f3_genel_toplam": 0, + "malzeme_sayisi": 0, + "uygun_gorulen_firma_adi_adresi": kazanan_firma.adres, + "uygun_gorulen_teklif_tutari": 0, + "gorevli": [ + {"ad": str(satin_alma_object.sorumlu.user), "unvan": "Proje Yürütücüsü"}, + {"ad": "", "unvan": ""}, + {"ad": "", "unvan": ""} + ], + "harcama_yetkilisi": {"ad": "", "unvan": ""}, + "belge_imza_tarihi": formatted_date + } + + i = 0 + for malz in malzemeler: + i += 1 + teklifler = [] + for firm in [kazanan_firma, firma2, firma3]: + teklifler.append(BAPTeklifFiyatIsleme.objects.get(firma=firm, + kalem=malz.butce)) + + # Firmaların verdiği teklifler ve malzemeler liste olarak context'e ekleniyor. + context['malzemeler'].append({"sira_no": i, + "adi": malz.butce.ad, + "miktar": malz.butce.adet, + "birim": "Adet", + "f1_birim": teklifler[0].birim_fiyat, + "f1_toplam": teklifler[0].toplam_fiyat, + "f2_birim": teklifler[1].birim_fiyat, + "f2_toplam": teklifler[1].toplam_fiyat, + "f3_birim": teklifler[2].birim_fiyat, + "f3_toplam": teklifler[2].toplam_fiyat + }) + # Firmaların verdiği tekliflerin toplam tutuarı bulunuyor. + context['f1_genel_toplam'] += teklifler[0].toplam_fiyat + context['f2_genel_toplam'] += teklifler[1].toplam_fiyat + context['f3_genel_toplam'] += teklifler[2].toplam_fiyat + + context['malzeme_sayisi'] = i + context['uygun_gorulen_teklif_tutari'] = context['f1_genel_toplam'] + + return context + + def siparis_formu_context(self): + """ + Context data for siparis_formu template file. + Returns: + dict: Context data. + """ + satin_alma_object = self.model_class.objects.get(self.current.task_data['object_id']) + selected_butce_kalemi = self.input.get('data_key') + selected_butce_kalemi = BAPButcePlani.objects.get(selected_butce_kalemi) + + context = { + "isin_niteligi": selected_butce_kalemi.kod_adi, + "butce_tertibi": "2.20.00.00.00 1", + "isin_adi_veya_miktari": "", + "malzemeler": [ + { + "sira_no": 1, + "adi": selected_butce_kalemi.ad, + "miktar": selected_butce_kalemi.adet, + "birim": "Kalem" + } + ], + "yuklenici_firma_adi": selected_butce_kalemi.kazanan_firma.ad, + "tebligata_esas_adresi": selected_butce_kalemi.kazanan_firma.adres, + "siparis_bedeli": selected_butce_kalemi.toplam_fiyat, + "odeme_saymanligi": "Strateji Geliştirme Dairesi Başkanlığı", + "vergi_resim_ve_harclar": "Yükleniciye Aittir", + "garanti_suresi_ve_sartlar": "", + "yedek_parca_montaj_sartlari": "", + "teslim_suresi": "", + "gerceklestirme_gorevlisi": {"ad": str(satin_alma_object.sorumlu.user), "unvan": "Proje Yürütücüsü"}, + "harcama_yetkilisi": {"ad": "", "unvan": ""}, + "belge_yili": datetime.now().year + } + return context + + def muayene_gorevlendirmesi_context(self): + """ + Context variables for muayene_gorevlendirmesi file. + Returns: + dict: Context data. + """ + satin_alma_object = self.model_class.objects.get(self.current.task_data['object_id']) + rightnow = datetime.now() + context = { + "dilekce_sayisi": "", + "dilekce_tarihi": datetime.strftime(rightnow,'%d.%m.%Y'), + "gerceklestirme_gorevlisi": {"ad": str(satin_alma_object.sorumlu.user), "unvan": "Proje Yürütücüsü"}, + "harcama_yetkilisi": {"ad": "", "unvan": ""}, + "muayene_komisyonu_idari_uzman": "", + "muayene_komisyonu_teknik_uzman": "", + "muayene_komisyonu_ambar_gorevlisi": "" + } + return context + + def bap_muayene_ve_kabul_komisyon_tutanagi(self): + """ + Prepare context data. + Returns: + dict: + """ + satin_alma_object = self.model_class.objects.get(self.current.task_data['object_id']) + malzemeler = satin_alma_object.ButceKalemleri + kazanan_firma = malzemeler[0].butce.kazanan_firma + + context = { + "i_f_no": "", + "nereden_geldigi": kazanan_firma.ad, + "dayandigi_belge_sayisi": "", + "dayandigi_belge_tarihi": "", + "muayene_kabul_komisyonu_tutanagi_tarihi": "", + "tasinirlar": [], + "tasinir_sayisi": len(malzemeler), + "baskan": {"adi": str(satin_alma_object.sorumlu.user), "unvan": "Proje Yürütücüsü"}, + "uye1": {"adi": "", "unvan": ""}, + "uye2": {"adi": "", "unvan": ""} + } + for malz in malzemeler: + context['tasinirlar'].append({ + "miktari": malz.butce.adet, + "birimi": "Adet", + "adi_ve_ozellikleri": "{} {}".format(malz.butce.ad, malz.butce.ozellik) + }) + return context + @obj_filter def satin_alma_duyurulari_actions(self, obj, result): """ @@ -457,11 +709,17 @@ def satin_alma_duyurulari_actions(self, obj, result): """ data = {1: {"name": "Teklife Kapat", "cmd": "teklife_kapat"}, - 2: {"name": "Teklifleri Değerlendir", "cmd": "degerlendir"}, - 3: {"name": "Satın Alma Bilgilerini Güncelle", "cmd": "satin_alma"}} + 2: {"name": "Teklifleri Değerlendir", "cmd": "degerlendir"}} if obj.teklif_durum == 1 and obj.teklife_kapanma_tarihi < datetime.now(): result['actions'] = [{'name': "Düzenle", 'cmd': "duzenle", "mode": "normal", "show_as": "button"}] + + elif obj.teklif_durum == 3: + result['actions'] = [{"name": "Satın Alma Bilgilerini Güncelle", "cmd": "satin_alma", "mode": "normal", + "show_as": "button"}, + {"name": "Belgeleri İndir", "cmd": "template_sec", "mode": "normal", + "show_as": "button"}] + else: result['actions'] = [{"name": data[obj.teklif_durum]["name"], "cmd": data[obj.teklif_durum]["cmd"], "mode": "normal",