Pythontr

husonet | Tarih: 08.06.2016

Python wsdl kullanımı

Python web servis kullanımları için wsdl methodlarına örnek teşkil etmesi için hazırlanmıştır.

Wsdl nedir? http yada https protokelleri ile client ve server arasında veri alışverişi yapabilen bir katmandır. Ayrıca WSDL web servis teknolojilerinin arasında en gelişmiş olanlarından bir tanesidir. Aslında, internet ortamında çok kullanım örneği olmamasına rağmen kullanımı oldukça basittir. Bizde örneğimizi hazırlarken Python programlama diline ait suds kütüphanesinden yararlandık.


Hazırladığımız örnek şu an izibiz firmasına ait earsiv yani fatura gönderiminde kullanılan ver iletişimini sağlamak amacıyla yazmış olduğum bir class.


#!/usr/bin/python
# -*- coding:utf-8 -*-

################################################################################
# Huseyin OZDEMIR
# husonet
# 07.06.2016
# Bu betik wsdl uzerinden gonderilmek icin paketler hazirlar.
################################################################################

# apt-get install python-suds
from suds.client import Client
from datetime import datetime
from base64 import b64encode
import uuid

WSDL = 'https://ari3.i2i-systems.com:2443/EIWSOIBProxy/EFaturaOIBProxy?wsdl'

KULLANICI_ADI = 'xxxxxx'
SIFRE = 'xxxxxx'

# gonderen firma bilgileri
UNVAN = 'GÖNDEREN DENEME LTD.ŞTİ.'.decode('utf-8')
ADRES = 'HALDUR DORMEN CAD.NO:10 ÇANKAYA-ANKARA'.decode('utf-8')
TEL = '03120000000'
FAX = '03120000001'
EMAIL = 'info@xxxxxx.com'
WEB = 'http://www.xxxxx.com'
VDR = 'MALTEPE'
VNR = '4840847211'
MERSIS = '0-4630-1106-0700019'
ULKE = 'Türkiye'.decode('utf-8')
SEHIR = 'Ankara'.decode('utf-8')
ILCE = 'Çankaya'.decode('utf-8')

# Alıcı firma bilgileri
A_UNVAN = 'ALICI DENEME A.S.'.decode('utf-8')
A_ADRES = 'HAVALANI KAVSAGI YESILKOY'.decode('utf-8')
A_TEL = ''
A_FAX = ''
A_EMAIL = ''
A_WEB = ''
A_VDR = 'MARMARA KURUMLAR'
A_VNR = '4840847212'
A_MERSIS = ''
A_ULKE = 'Türkiye'.decode('utf-8')
A_SEHIR = 'ISTANBUL'.decode('utf-8')
A_ILCE = 'Yeşilköy'.decode('utf-8')
# SAHIS ISE
AD = ''
SOYAD = ''

# DEBUG 1 ise debug et
DEBUG = 1

#------------------------------------------------------------------------------
# EArsiv istemci sinifi
class EClient():
kullanici_adi = None
sifre = None
wsdl = None
session_id = None
client = None

#--------------------------------------------------------------------------
# Nesne ilk olusturuldugunda calisacak bolum. Eger ilk degerler verildiyse
# set edilecek
def __init__(self, sKullaniciAdi=None, sSifre=None, sWsdl=None):
if sKullaniciAdi is not None:
self.kullanici_adi = sKullaniciAdi
if sSifre is not None:
self.sifre = sSifre
if sWsdl is not None:
self.wsdl = sWsdl

#--------------------------------------------------------------------------
# login olan method
def login(self):
try:
self.client = Client(self.wsdl,cache = None)
self.session_id = self.client.service.Login(self.kullanici_adi, self.sifre)
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
self.session_id = None

#--------------------------------------------------------------------------
# send invoice
def send_invoice(self, sInvPro, sInv):
try:
print self.client.service.SendInvoiceByXml(self.session_id,
sInvPro, sInv)
except Exception, err:
if DEBUG:
print(str(err))
else:
raise

#--------------------------------------------------------------------------
# SET INVOICE_TYPE, EMAIL_FLAG
def set_invoice_type(self, sInvoiceType, sEmailFlag):
try:
result = None
inv = self.client.factory.create('INVOICE_PROPERTIES')
inv.INVOICE_TYPE = sInvoiceType
inv.EMAIL_FLAG = sEmailFlag
result = inv
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET NOTE
def set_note(self, sAciklama):
try:
result = None
note = self.client.factory.create('NOTE')
note.NOTE = sAciklama
result = note
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET LEGAL_MONETARY_TOTAL
def set_alt_toplam(self, sToplam, sIskontoTutar, sGenelToplam):
try:
result = None
top = self.client.factory.create('LEGAL_MONETARY_TOTAL')
top.LINE_EXTENSION_AMOUNT = sToplam
top.TAX_EXCLUSIVE_AMOUNT = sToplam
top.TAX_INCLUSIVE_AMOUNT = sGenelToplam
top.ALLOWANCE_TOTAL_AMOUNT = sIskontoTutar
top.PAYABLE_AMOUNT = sGenelToplam
result = top
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET INVOICE
def set_invoice(self, sSenaryo, sFaturaNo, sUUID, sTarih, sSaat,sFaturaTip,
sParaBirimi, sSatirSayisi, sNote, sKur, sFile, sGond, sAlici, sVergi, sAltToplam,
sInvoiceLine):
try:
result = None
invoice = self.client.factory.create('INVOICE')
invoice.PROFILE_ID = sSenaryo
invoice.INVOICE_ID = sFaturaNo
invoice.UUID = sUUID
invoice.ISSUE_DATE = sTarih
invoice.ISSUE_TIME = sSaat
invoice.INVOICE_TYPE_CODE = sFaturaTip
invoice.DOCUMENT_CURRENCY_CODE = sParaBirimi
invoice.LINE_COUNT_NUMERIC = sSatirSayisi
invoice.NOTE = sNote
invoice.CALCULATION_RATE = sKur
invoice.ADDITIONAL_DOCUMENT_REFERENCE = sFile
invoice.ACCOUNTING_SUPPLIER_PARTY = sGond
invoice.ACCOUNTING_CUSTOMER_PARTY = sAlici
invoice.TAX_TOTAL = sVergi
invoice.LEGAL_MONETARY_TOTAL = sAltToplam
invoice.INVOICE_LINE = sInvoiceLine
result = invoice
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET ALLOWANCE_CHARGES
def set_allowance_charge(self, sIskontoTutari, sBirimFiyat):
try:
result = None
iskonto_orani = (sIskontoTutari / sBirimFiyat)
iskonto = self.client.factory.create('ALLOWANCE_CHARGE')
iskonto.CHARGE_INDICATOR = False
iskonto.MULTIPLIER_FACTOR_NUMERIC = iskonto_orani
iskonto.AMOUNT = sIskontoTutari
iskonto.BASE_AMOUNT = sBirimFiyat
result = iskonto
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result


#--------------------------------------------------------------------------
# SET TAX_SUB_TOTAL
def set_tax_sub_total(self, sTutar, sKdv, sSiraNo, sKdvOran):
try:
result = None
MUAF_ADI = ''
MUAF_ACIKLAMA = ''
MUAF_KOD = '0015'
if not sKdv > 0:
MUAF_ADI = 'KDV'
MUAF_ACIKLAMA = 'MUAF MADDE 14/1'

vergi = self.client.factory.create('TAX_SUB_TOTAL')
vergi.TAX_ABLE_AMOUNT = sTutar
vergi.TAX_AMOUNT = sKdv
vergi.CALCULATION_SEQ_NUMERIC = sSiraNo
vergi.PERCENT = sKdvOran
vergi.TAX_NAME = MUAF_ADI
vergi.TAX_TYPE_CODE = MUAF_KOD
vergi.TAX_EXEMPTION_REASON = MUAF_ACIKLAMA
result = vergi
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET PARTY_IDENTIFICATION
def set_party_identification(self, sVkn, sType):
try:
result = None
party = self.client.factory.create('PARTY_IDENTIFICATION')
party.ID = sVkn
party.TYPE = sType
result = party
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET POSTAL_ADDRESS
def set_postal_address(self, sGondAdres, sGondIlce, sGondSehir, sGondUlke):
try:
result = None
adres = self.client.factory.create('POSTAL_ADDRESS')
adres.BUILDING_NUMBER = '-'
adres.STREET_NAME = sGondAdres
adres.CITY_SUB_DIVISION_NAME = sGondIlce
adres.CITY_NAME = sGondSehir
adres.COUNTRY = sGondUlke
adres.POSTAL_ZONE = '-'
result = adres
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET CONTACT
def set_contact(self, sTel, sFax, sEMail):
try:
result = None
contact = self.client.factory.create('CONTACT')
contact.TELEPHONE = sTel
contact.TELEFAX = sFax
contact.ELECTRONIC_MAIL = sEMail
result = contact
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET PARTY
def set_party(self, sWeb, sPartyIdent, sUnvan, sAdres, sVdr, sContact, sAd,
sSoyad):
try:
result = None
party = self.client.factory.create('PARTY')
party.WEB_SITE_URI = sWeb
party.PARTY_IDENTIFICATION = sPartyIdent
party.NAME = sUnvan
party.POSTAL_ADDRESS = sAdres
party.PARTY_TAX_SCHEME = sVdr
party.CONTACT = sContact
party.FIRST_NAME = sAd
party.FAMILY_NAME = sSoyad
result = party
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET ACCOUNTING_SUPPLIER_PARTY
def set_gonderen(self, sParty):
try:
result = None
gond = self.client.factory.create('ACCOUNTING_SUPPLIER_PARTY')
gond.PARTY = sParty
result = gond
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET ACCOUNTING_CUSTOMER_PARTY
def set_alici(self, sParty):
try:
result = None
alici = self.client.factory.create('ACCOUNTING_CUSTOMER_PARTY')
alici.PARTY = sParty
result = alici
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET TAX_TOTAL
def set_tax_total(self, sTaxAmount, sTaxSubTotal):
try:
result = None
vergi = self.client.factory.create('TAX_TOTAL')
vergi.TAX_AMOUNT = sTaxAmount
vergi.TAX_SUB_TOTAL = sTaxSubTotal
result = vergi
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET INVOICE LINE
def set_invoice_line(self, sId, sAdet, sUnitCode, sTutar, sIskonto, sVergi,
sAciklama, sBirimFiyat):
try:
result = None
invoice = self.client.factory.create('INVOICE_LINE')
invoice.ID = sId
invoice.INVOICE_QUANTITY = sAdet
invoice.UNITCODE = sUnitCode
invoice.LINE_EXTENSION_AMOUNT = sTutar
invoice.ALLOWANCE_CHARGES.append(sIskonto)
invoice.TAXTOTAL = sVergi
invoice.ITEM_NAME = sAciklama
invoice.ITEM_PRICE = sBirimFiyat
result = invoice
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#--------------------------------------------------------------------------
# SET ADDITIONAL_DOCUMENT_REFERENCE
def set_additional_document_reference(self, sUuid, sFaturaTarihi,
sDoctTypeCode, sDoctType=None, sFile=None):
try:
result = None
add = self.client.factory.create('ADDITIONAL_DOCUMENT_REFERENCE')
add.ID = sUuid
add.ISSUE_DATE = sFaturaTarihi
# add.DOCUMENT_TYPE_CODE = 'SendingType'
add.DOCUMENT_TYPE_CODE = sDoctTypeCode
if not sDoctType == '':
add.DOCUMENT_TYPE = sDoctType
if not sFile == '':
add.ATTACHMENT = sFile
result = add
except Exception, err:
if DEBUG:
print(str(err))
else:
raise
result = None
return result

#------------------------------------------------------------------------------
# load template
def load_template(sFile):
try:
result = ''
f = open(sFile, 'r')
result = f.read()
f.close()
except Exception, err:
if DEBUG:
raise
print(str(err))
result = None
return result

#------------------------------------------------------------------------------
# main prosess
if __name__ == '__main__':
# fatura detay

UNITCODE = 'C62'
ADET = 1
KDV=8.1
TUTAR=45
SIRA_NO='1'
KDV_ORAN=18

# iskonto
ISKONTO_TUTAR = 0
BIRIM_FIYAT = 45.0000
ACIKLAMA = 'HIZMET UCRETI'

# fatura master
SENARYO = 'TEMELFATURA'
FATURA_NO = 'TET2016000003885'
# uuid4 random uretir uuid1 host ID ye gore uretir
UUID = uuid.uuid4()
#TARIH = datetime.strftime('2016-05-25 00:00:00', "%Y-%m-%d")
#SAAT = datetime.strftime('2016-05-25 00:00:00', "%H:%M:%S")
TARIH = '2016-05-25'
SAAT = '00:00:00'
FATURA_TIPI = 'SATIS'
SATIR_SAYISI = 1
KUR = 1
PARA_BIRIMI = 'TRY'

NOTE = []
PARTY_ID = []
A_PARTY_ID = []
FD = []

ADDENTION = []

b_file = load_template('/home/huso/python/gib.xslt')
b_file = b64encode(b_file)

ea = EClient(KULLANICI_ADI, SIFRE, WSDL)
ea.login()
if ea.session_id is not None:
iskonto = ea.set_allowance_charge(ISKONTO_TUTAR, BIRIM_FIYAT)
vergi = ea.set_tax_sub_total(TUTAR, KDV, SIRA_NO, KDV_ORAN);
vergi = ea.set_tax_total(KDV, vergi)
FD.append(ea.set_invoice_line(SIRA_NO, ADET, UNITCODE, TUTAR, iskonto,
vergi, ACIKLAMA, BIRIM_FIYAT))
NOTE.append(ea.set_note('BANKA HESAP NUMARALARI'))
NOTE.append(ea.set_note('TL 000000 IBAN: TR00 0000 0000 0000 0000 0000 00'))
PARTY_ID.append(ea.set_party_identification(VNR, 'VKN'))
post_adress = ea.set_postal_address(ADRES, ILCE, SEHIR, ULKE)
contact = ea.set_contact(TEL,FAX,EMAIL)
party = ea.set_party(WEB, PARTY_ID, UNVAN, post_adress, VDR, contact,
AD, SOYAD)
gond = ea.set_gonderen(party)
A_PARTY_ID.append(ea.set_party_identification(A_VNR, 'VKN'))
party = ea.set_party(A_WEB, A_PARTY_ID, A_UNVAN, post_adress, A_VDR, contact,
AD, SOYAD)
alici = ea.set_alici(party)
vergi_master = ea.set_tax_sub_total(TUTAR, KDV, SIRA_NO, KDV_ORAN);
vergi_master = ea.set_tax_total(KDV, vergi_master)
alt_toplam = ea.set_alt_toplam(TUTAR, 0, 93)
ADDENTION.append(ea.set_additional_document_reference(UUID, TARIH,
'SendingType', 'KAGIT', b_file))
ADDENTION.append(ea.set_additional_document_reference(UUID, TARIH,
'EArchiveType', 'NORMAL', None))
fatura = ea.set_invoice(SENARYO, FATURA_NO, UUID, TARIH, SAAT,
FATURA_TIPI, PARA_BIRIMI, SATIR_SAYISI, NOTE, KUR, ADDENTION, gond, alici,
vergi_master, alt_toplam, FD)
fat_type = ea.set_invoice_type('EARCHIVE', 'N')
ea.send_invoice(fat_type, fatura)

Örnek çıktı aşağıdaki şekilde olmalıdır.


(result){
ERROR_DESC = "1 adet fatura içerisinden HTT2016000003885 nolu fatura kaydedilemedi, Hata:Fatura sistemde mevcuttur. Fatura No:HTT2016000003885"
INTL_TXN_ID = 1286852990
RETURN_CODE = -1
UUID = "3b9dc28f-ed94-46ad-a37a-7cc45098c2b9"
}

İlgili Konular: SOAP için Python soap kullanımı