makaleler / Python Programlama / Python wsdl kullanımı

Python wsdl kullanımı

08.06.2016 17:37:57

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 = '[url]https://ari3.i2i-systems.com:2443/EIWSOIBProxy/EFaturaOIBProxy?wsdl[/url]'

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   = '[url]http://www.xxxxx.com[/url]'
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ı

yazar husonet

Yorumlar

Bu içerik için sizde yorum yapabilirsiniz!
anasayfa | makaleler | haberler | dosyalar | linkler | hakkımızda