الفاتورة الالكترونية لهيئة الزكاة والدخل فى السعودية المرحلة الثانية
الفاتورة الالكترونية لهيئة الزكاة والدخل فى السعودية المرحلة الثانية كما سبق و ان تناولنا موضوع ربط تطبيقات الاوفيس بافكار api نتناول اليوم فكره ربط الاكسيس و الاكسيل بمنظومه الفاتورة الالكترونية لهيئة الزكاة والدخل فى السعودية المرحلة الثانية و تحديد متطلباتها الفاتوره الالكترونيه
متطلبات الفاتوره الالكترونية لهيئة الزكاة والدخل فى السعودية المرحلة الثانية
لتطبيق المرحله الثانيه للفاتوره الالكترونيه يتم من خلال ثلاث مراحل يمكن ترتيبها كما يلي
- المرحله الاولي تجهيز ملف xml بالبيانات الالزاميه التي سوف يقوم البرنامج بارسالها ملف xml الخاص بالفاتوره الالكترونيه
- المرحله الثانيه مرحله التوقيع الالكتوني علي الفاتوره الالكترونيه لملف xml و ذلك لاثبات التوقيع الالكتروني قبل ارسال البيانات الي هيئه الزكاه و يتم استخدام مفتاح التشفير sdk الخاص بهيئه الزكاه و الدخل
- مرحله ما بعد التوقيع و هنا اصبح الملف جاهز للارسال و يتم استخدام مجموعه من المكتبات البرمجيه الخاصه 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
ارغب بالتواصل معك
ZatcaUBLXMLGenerator.tlb هل يمكن تحميل هذا الملف