الفاتورة الالكترونية لهيئة الزكاة والدخل فى السعودية المرحلة الثانية

الفاتورة الالكترونية لهيئة الزكاة والدخل فى السعودية المرحلة الثانية

الفاتورة الالكترونية لهيئة الزكاة والدخل فى السعودية المرحلة الثانية كما سبق و ان تناولنا موضوع ربط تطبيقات الاوفيس بافكار api نتناول اليوم فكره ربط الاكسيس و الاكسيل بمنظومه الفاتورة الالكترونية لهيئة الزكاة والدخل فى السعودية المرحلة الثانية و تحديد متطلباتها الفاتوره الالكترونيه

متطلبات الفاتوره الالكترونية لهيئة الزكاة والدخل فى السعودية المرحلة الثانية

لتطبيق المرحله الثانيه للفاتوره الالكترونيه يتم من خلال ثلاث مراحل يمكن ترتيبها كما يلي

  1. المرحله الاولي تجهيز ملف xml بالبيانات الالزاميه التي سوف يقوم البرنامج بارسالها ملف xml الخاص بالفاتوره الالكترونيه
  2. المرحله الثانيه مرحله التوقيع الالكتوني علي الفاتوره الالكترونيه لملف xml و ذلك لاثبات التوقيع الالكتروني قبل ارسال البيانات الي هيئه الزكاه و يتم استخدام مفتاح التشفير sdk الخاص بهيئه الزكاه و الدخل
  3. مرحله ما بعد التوقيع و هنا اصبح الملف جاهز للارسال و يتم استخدام مجموعه من المكتبات البرمجيه الخاصه api لاتمام عمليه ارسال الملف

المرحله الاولي تجهيز ملف xml

المرحله الاولي و هي تجهيز الملف بالبيانات الالزاميه و من الجدير بالذكر انه هيئه الزكاه السعوديه قد حدد البيانات الالزاميه التي يجب اضفتها و البيانات الاخياريه و سوف نتعرف عليها في هذا المقال يجب العلم انه اذا وجد بيانات غير صحيحه في ملف xml فسوف يتم رفض ملف xml ملف الفاتوره الالكترونيه وذلك من قبل هيئه الزكاه و الدخل

 مرحلة التوقيع الإلكترونى لملف xml 

و في هذه المرحله يمكنك الدخول الي موقع هيئه الزكاه ثم قم بالتسجيل بالموقع و تختار بوابه المطورين و تختار نظام الفاتوره الاكترونيه و تحميل ملف sdk و هو ملف تشفير البيانات المرسله الخاص و ايضا وظيفته للتاكد من صحه التوقيع الالكتروني لملف الفاتوره الالكتونيه قبل اخر مرحله و هي ارسال ملف xml

مرحله ارسال الفاتوره الالكترونيه

مرحله ارسال الفاتوره الالكترونيه بصيغه xml بعد عمليه التوقيع الالكتروني عليها من خلال مفتاح التشفير sdk

وقد وفرت هيئه الزكاه و الدخل مجموعه من الادوات للتاكد من الملفات المرسله قبل بدا التطبيق الفعلي

و من هذه الادوات رابط للبيئه التجريبيه و التي يمكنك التجربه عليها من قبل المرحله الفعليه

بالنسبه الي لغات البرمجه مثل vb6

يجب العلم انه في المشاريع الخاصه بلغات البرمجه القديمه مثل vba قد تحتاج الي تثبيت بعض المكتبات البرمجيه الخارجيه المعده باي لغه برمجه حديثه

و التي من شئنها عمل دمج مع البرنامج الاساسي المستخدم في انشاء الفاتوره ب vba او vb6

الفاتورة الالكترونية لهيئة الزكاة والدخل فى السعودية المرحلة الثانية

قبل مرحله الارسال

و يجب ملاحظه انه يجب التاكد من اتصال الجهاز بالانترنت قبل عمليه الارسال

و يمكن عمل بعض الافكار البرمجيه لاعاده ارسال اي فاتوره لم يقم البرنامج بارسلها عند اعاده الاتصال بالانترنت مره اخري

في حاله فشل البرنامج في عمليه الارسال بسبب اي مشكله في جوده الاتصال بالانترنت

و يمكن أيضا اضافه امر للتاكد من اتصال الجهاز بالانترنت

مرحله تثبيت المكتبه البرمجيه الخاصه sdk

بالنسبه الي مرحله تثبيت المكتبه البرمجيه الخاصه sdk يمكنك تسهيل الامر البرمجي عليك عن طريق عمل ذلك من خلال ملف register.cmd

و يكون الامر المستخدم داخل الملف كما يلي

@ECHO OFF
reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS=32BIT || set OS=64BIT
"%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\regasm.exe" /unregister SDKPath/ZatcaUBLXMLGenerator.dll
"%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\regasm.exe" /codebase SDKPath/ZatcaUBLXMLGenerator.dll /tlb SDKPath/ZatcaUBLXMLGenerator.tlb
if %OS%==64BIT "%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\regasm.exe" /unregister SDKPath/ZatcaUBLXMLGenerator.dll
if %OS%==64BIT "%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\regasm.exe" /codebase SDKPath/ZatcaUBLXMLGenerator.dll /tlb SDKPath/ZatcaUBLXMLGenerator.tlb
pause

مع استبدال SDKPath بمسار  ZatcaUBLXMLGenerator.dll

الصياغه البرمجيه المطلوبه لاعداد ملف xml بلغه vb6

'On Error Resume Next: Err.Clear
Dim ubl As ZatcaUBLXMLGenerator.UBLXML
Set ubl = New ZatcaUBLXMLGenerator.UBLXML
Dim inv As ZatcaUBLXMLGenerator.Invoice
Set inv = New ZatcaUBLXMLGenerator.Invoice
Dim res As ZatcaUBLXMLGenerator.Result
Set res = New ZatcaUBLXMLGenerator.Result
'بيانات الفاتورة
inv.id = "1230"
inv.IssueDate = "2021-01-21"
inv.IssueTime = "09:32:40"
' فاتورة ضريبية او مبسطة 388
' اشعار مدين 383
' 381 اشعار دائن
inv.InvoiceTypeCode.id = 388
'inv.invoiceTypeCode.Name based on format NNPNESB
'NN 01 للفاتورة الضريبية
'NN 02 للفاتورة الضريبية المبسطة
'P فى حالة فاتورة لطرف ثالث نكتب 1 وفى الحالة الاخرى نكتب 0
'N فى حالة فاتورة اسمية نكتب 1 فى الحالة الاخرى نكتب 0
'E فى حالة فاتورة للصادرات نكتب 1 وفى الحالة الاخرى نكتب 0
'S فى حالة فاتورة ملخصة نكتب 1 وفى الحالة الاخرى نكتب 0
'B فى حالة فاتورة ذاتية نكتب 1
'B فى حالة ان الفاتورة صادرات=1 لا يمكن ان تكون الفاتورة ذاتية =1

inv.InvoiceTypeCode.Name = "0200000"
inv.DocumentCurrencyCode = "SAR"
inv.TaxCurrencyCode = "SAR"

'فى حالة اشعار دائن او مدين فقط هانكتب رقم الفاتورة اللى اصدرنا الاشعار ليها
inv.BillingReference.InvoiceDocumentReferenceID = "123654"

' قيمة عداد الفاتورة
inv.AdditionalDocumentReferenceICV.UUID = 123456 'ممكن يكون رقم الفاتورة ولكن لابد يكون ارقام فقط
' فى حالة فاتورة مبسطة وفاتورة ملخصة هانكتب تاريخ التسليم واخر تاريخ التسليم
inv.Delivery.ActualDeliveryDate = "2022-10-22"
inv.Delivery.LatestDeliveryDate = "2022-10-23"
' بيانات الدفع
' اكواد معينة
' اختيارى كود الدفع
inv.PaymentMeans.PaymentMeansCode = "42" ' الدفع لحساب بنكى
inv.PaymentMeans.InstructionNote = "Returned items" 'فى حالة اشعار الدائن والمدين لابد من ادخالها
inv.PaymentMeans.PayeeFinancialAccount.id = "" ' فى حالة كان الدفع من خلال البنك رقم حساب البنك IBAN
inv.PaymentMeans.PayeeFinancialAccount.paymentnote = "Payment by credit" ' فى حالة كان الدفع من خلال البنك

'بيانات البائع
inv.SupplierParty.PartyIdentification.id = "123456" ' رقم السجل التجارى الخاض بالبائع
inv.SupplierParty.PartyIdentification.schemeID = "CRN" ' رقم السجل التجارى
inv.SupplierParty.PostalAddress.StreetName = "Kemarat Street," ' اسم الشارع
inv.SupplierParty.PostalAddress.AdditionalStreetName = "" ' اختياري
inv.SupplierParty.PostalAddress.BuildingNumber = "3724" ' اختيارى رقم المبنى
inv.SupplierParty.PostalAddress.PlotIdentification = "9833" ' اختيارى رقم القطعة
inv.SupplierParty.PostalAddress.CityName = "Jeddah" 'اسم المدينة
inv.SupplierParty.PostalAddress.PostalZone = "15385" ' الرقم البريدى
inv.SupplierParty.PostalAddress.CountrySubentity = "Makkah" 'اسم المحافظة اختيارى
inv.SupplierParty.PostalAddress.CitySubdivisionName = "Alfalah" ' اسم المنطقة او الحى
inv.SupplierParty.PostalAddress.Country.IdentificationCode = "SA"
inv.SupplierParty.PartyLegalEntity.RegistrationName = "First Shop" ' اسم الشركة
inv.SupplierParty.PartyTaxScheme.CompanyID = "310175397400003" ' رقم التسجيل الضريبي

'بيانات المشترى
' اختيارى فى حالة الفاتورة المبسطة

inv.CustomerParty.PartyIdentification.id = "123456"
inv.CustomerParty.PartyIdentification.schemeID = "CRN"
inv.CustomerParty.PostalAddress.StreetName = "Kemarat Street,"
inv.CustomerParty.PostalAddress.AdditionalStreetName = "" ' اختياري
inv.CustomerParty.PostalAddress.BuildingNumber = "3724"
inv.CustomerParty.PostalAddress.PlotIdentification = "9833" '  أيضا اختياري
inv.CustomerParty.PostalAddress.CityName = "Jeddah"
inv.CustomerParty.PostalAddress.PostalZone = "15385"
inv.CustomerParty.PostalAddress.CountrySubentity = "Makkah" '  أيضا اختياري
inv.CustomerParty.PostalAddress.CitySubdivisionName = "Alfalah"
inv.CustomerParty.PostalAddress.Country.IdentificationCode = "SA"
inv.CustomerParty.PartyLegalEntity.RegistrationName = "First Shop"
inv.CustomerParty.PartyTaxScheme.CompanyID = "301121971100003"
' بيانات الخصم على مستوى الفاتورة
Dim allowancecharge As ZatcaUBLXMLGenerator.allowancecharge
Set allowancecharge = New ZatcaUBLXMLGenerator.allowancecharge

'أيضا بد الخصم اذا توفر و هو بند اختياري
allowancecharge.Amount = 2 ' قيمة الخصم

allowancecharge.AllowanceChargeReason = "Reason" ' سبب الخصم على مستوى الفاتورة
allowancecharge.TaxCategory.id = "S" ' كود الضريبة
allowancecharge.TaxCategory.Percent = 15# ' نسبة الضريبة
inv.allowanceCharges.Add allowancecharge
'بيانات الفاتورة

Dim invline As ZatcaUBLXMLGenerator.InvoiceLine
Set invline = New ZatcaUBLXMLGenerator.InvoiceLine
invline.InvoiceQuantity = 44 'الكمية

' ان وجد على مستوى سعر المنتج
invline.Price.allowancecharge.AllowanceChargeReason = "Reason" ' سبب الخصم على مستوى المنتج
invline.Price.allowancecharge.Amount = 2 ' قيمة الخصم

invline.Item.Name = "Computer" ' اسم المنتج
invline.Item.ClassifiedTaxCategory.id = "S" 'خاضع لضريبة
invline.Item.ClassifiedTaxCategory.Percent = 15# ' نسبة الضريبة

invline.Price.PriceAmount = 25 'سعر المنتج

Dim taxsub As ZatcaUBLXMLGenerator.TaxSubtotal
Set taxsub = New ZatcaUBLXMLGenerator.TaxSubtotal

taxsub.TaxCategory.id = "S" ' خاضع للضريبة
taxsub.TaxCategory.Percent = 15#
taxsub.TaxCategory.TaxExemptionReason = "Not subject to VAT" 'السبب لو كود الضريبة كان O,E بمعنى انه غير خاضع للضريبة
'taxsub.TaxCategory.TaxExemptionReason = "" 'السبب لو كود الضريبة كان E بمعنى انه معفى من ضريبة القيمة المضافة
taxsub.TaxCategory.TaxExemptionReasonCode = "" ' فى حالة كان كود الضريبة Z لابد من ادخال كود اعفاء الضريبة
invline.TaxTotal.TaxSubtotal.Add taxsub
inv.InvoiceLines.Add invline

Set res = ubl.GenerateInvoiceXML(inv)

If res.isValid = True Then
' هذة النتائج يرجى حفظها فى قاعدة البيانات الخاصة بالفاتورة لكى تكون مرجع لكم فيما بعد
MsgBox res.InvoiceHash
MsgBox res.SingedXML

'يفضل حفظ جميع هذه الاشعارات في قاعده بيانات البرنامج
MsgBox res.EncodedInvoice
MsgBox res.UUID

'بما في ذلك كود Qr   أيضا يفضل حفظه في قاعده بيانات البرنامج

MsgBox res.QRCode
MsgBox res.PIH

'و أيضا يفضل حفظ اسم الملف المرسل
MsgBox res.SingedXMLFileName
' after complete xml send it to zatca api
Dim apireqlogic As ZatcaUBLXMLGenerator.ApiRequestLogic
Set apireqlogic = New ZatcaUBLXMLGenerator.ApiRequestLogic
Dim tokenresponse As ZatcaUBLXMLGenerator.ComplianceCsrResponse
Set tokenresponse = New ZatcaUBLXMLGenerator.ComplianceCsrResponse

Dim invrequestbody As ZatcaUBLXMLGenerator.InvoiceReportingRequest
Set invrequestbody = New ZatcaUBLXMLGenerator.InvoiceReportingRequest

Set tokenresponse = apireqlogic.GetComplianceCSIDAPI("123345", "")
If tokenresponse.ErrorMessage = "" Then

invrequestbody.Invoice = res.EncodedInvoice
invrequestbody.InvoiceHash = res.InvoiceHash
invrequestbody.UUID = res.UUID
Dim invoicereportingmodel As ZatcaUBLXMLGenerator.InvoiceReportingResponse
Set invoicereportingmodel = apireqlogic.CallComplianceInvoiceAPI(tokenresponse.BinarySecurityToken, tokenresponse.Secret, invrequestbody)
If invoicereportingmodel.ErrorMessage = "" Then
'
' reporting status must be REPORTED
MsgBox invoicereportingmodel.ReportingStatus 'REPORTED
Else
MsgBox invoicereportingmodel.ErrorMessage
End If
Else
MsgBox tokenresponse.ErrorMessage
End If
' End If
Else
MsgBox res.ErrorMessage
End If
End Sub

 

يمكن ان يعجبك أيضا

خطوه في تجهيز برامج الاكسيس للربط مع الويب

افكار برمجيه لحمايه ملف الاكسيس

اضافه شريط تحميل للنموذج في الاكسيس ProgressBar


2 تعليقات

  1. bcfcaaedea?s=&#;d=mm&#;r=g

    ارغب بالتواصل معك

  2. bcfcaaedea?s=&#;d=mm&#;r=g

    ZatcaUBLXMLGenerator.tlb هل يمكن تحميل هذا الملف

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *