Стандарт ZUGFeRD был разработан в Германии специально для упрощения процесса электронного выставления счетов. Этот стандарт позволяет обмениваться счетами-фактурами без предварительного соглашения между поставщиком и получателем услуг или товаров. В Германии планируется применять этот стандарт повсеместно: в малом, среднем и крупном бизнесе, а также в государственных учреждениях.
Название стандарта – это аббревиатура ZUGFeRD. Расшифровывается как «Единое руководство для пользователей, разработанное Германским форумом по электронным счетам-фактурам».
В Германии уже используется стандарт электронного документооборота EDI (Electronic Data Interchange), но он используется только в крупных компаниях. Задача же ZUGFeRD охватить все сферы деятельности в стране, будь то частное предпринимательство или крупный автоконцерн. Этот стандарт универсален и не привязан к конкретной отрасли.
В основе ZUGFeRD лежит использование структурированных данных. Это реализовано с помощью стандарта XML. Человеко-читаемое представление счета реализуется с помощью стандарта PDF/A. В формате PDF/A-3 реализована возможность включать в документ объекты произвольного типа. Благодаря этому, в документ включается XML представление структурированных данных счета-фактуры. Таким образом, один документ содержит как человеко-читаемое представление, так и машино-читаемое.
Преимущества ZUGFeRD перед бумажным документооборотом:
ZUGFeRD поддерживает следующие типы счетов:
ZUGFeRD Basic
ZUGFeRD Comfort также поддерживает:
ZUGFeRD Extended также поддерживает:
Теперь рассмотрим некоторые детали документа стандарта ZUGFeRD. Как отмечалось выше, для машинной обработки счетов предусмотрен XML документ, интегрированный в PDF файл. Допускается также, включение XSD схемы в PDF документ.
XML-файл всегда внедряется в PDF документ с именем «ZUGFeRD-invoice.xml». Существует также возможность вставлять другие документы, объясняющие счет-фактуру, в качестве дополнительных файлов.
Вот так выглядит типичная счет-фактура в виде XML части ZUGFeRD документа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<ram:IncludedSupplyChainTradeLineItem> <ram:AssociatedDocumentLineDocument> <ram:LineID>1</ram:LineID> </ram:AssociatedDocumentLineDocument> <ram:SpecifiedSupplyChainTradeAgreement> <ram:GrossPriceProductTradePrice> <ram:ChargeAmount currencyID="EUR">1.0000</ram:ChargeAmount> </ram:GrossPriceProductTradePrice> <ram:NetPriceProductTradePrice> <ram:ChargeAmount currencyID="EUR">1.0000</ram:ChargeAmount> </ram:NetPriceProductTradePrice> </ram:SpecifiedSupplyChainTradeAgreement> <ram:SpecifiedSupplyChainTradeDelivery> <ram:BilledQuantity unitCode="C62">100.0000</ram:BilledQuantity> </ram:SpecifiedSupplyChainTradeDelivery> <ram:SpecifiedSupplyChainTradeSettlement> <ram:ApplicableTradeTax> <ram:TypeCode>VAT</ram:TypeCode> <ram:CategoryCode>S</ram:CategoryCode> <ram:ApplicablePercent>19.00</ram:ApplicablePercent> </ram:ApplicableTradeTax> <ram:SpecifiedTradeSettlementMonetarySummation> <ram:LineTotalAmount currencyID="EUR">100.00 </ram:LineTotalAmount> </ram:SpecifiedTradeSettlementMonetarySummation> </ram:SpecifiedSupplyChainTradeSettlement> <ram:SpecifiedTradeProduct> <ram:SellerAssignedID>ZS997</ram:SellerAssignedID> <ram:Name>Citric acid 100 ml</ram:Name> </ram:SpecifiedTradeProduct> </ram:IncludedSupplyChainTradeLineItem> |
Давайте теперь рассмотрим пример использования FastReport.Net для генерации счет-фактур ZUGFeRD. Вы можете найти его в папке «J:\Program Files (x86)\FastReports\FastReport.Net\Demos\C#\ZUGFeRD». Проект представляет собой обычное WinForms приложение.
Форма содержит поле ввода и две кнопки:
Одна из кнопок позволяет задать путь к файлу, используя стандартный диалог открытия файла. Вторая кнопка запускает процедуру генерации документа ZUGFeRD.
Рассмотрим код всего класса формы:
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
using FastReport; using FastReport.Export.Pdf; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; namespace ZUGFeRD { public partial class MainForm : Form { private string appPath; //Путь к папке с исполняемым файлом приложения public MainForm() { InitializeComponent(); } //Кнопка выбора xml-файла формата ZUGFeRD private void btnSelectFile_Click(object sender, EventArgs e) { //Стандартный диалог открытия файла using (OpenFileDialog openDialog = new OpenFileDialog()) { openDialog.Title = "Select ZUGFeRD XML"; openDialog.InitialDirectory = appPath; openDialog.Filter = "ZUGFeRD invoice XML (*.xml)|*.xml|All files (*.*)|*.*"; if (openDialog.ShowDialog() == DialogResult.OK) { tbZUGFeRDPath.Text = openDialog.FileName; //Присваиваем полю ввода имя выбранного файла } } } //Событие загрузки главной формы программы private void MainForm_Load(object sender, EventArgs e) { appPath = Path.GetDirectoryName(Application.ExecutablePath); //Задаем путь к папке с исполняемым файлом программы } //Кнопка создания PDF документа со счетом стандарта ZUGFeRD private void btnCreatePDF_Click(object sender, EventArgs e) { //Получаем путь к xml файлу string xmlFile = File.Exists(tbZUGFeRDPath.Text) ? tbZUGFeRDPath.Text : Path.Combine(appPath, tbZUGFeRDPath.Text); if (File.Exists(xmlFile)) { //Получаем путь к файлу отчета string reportFile = Path.Combine(appPath, "Invoice.frx"); if (File.Exists(reportFile)) { //Вызываем стандартный диалог сохранения файла using (SaveFileDialog saveDialog = new SaveFileDialog()) { saveDialog.Title = "Select path to save PDF file with embedded ZUGFeRD"; saveDialog.Filter = "PDF/A-3b file (*.pdf)|*.pdf|All files (*.*)|*.*"; saveDialog.FileName = "Invoice-With-ZUGFeRD.pdf"; if (saveDialog.ShowDialog() == DialogResult.OK) { using (Report report = new Report()) //Создаем объект отчета using (PDFExport pdf = new PDFExport()) //Создаем объект PDF экспорта using (FileStream file = new FileStream(xmlFile, FileMode.Open, FileAccess.Read)) //Создаем поток { report.Load(reportFile); //Загружаем отчет report.Prepare(); //Подготавливаем отчет pdf.PdfCompliance = PDFExport.PdfStandard.PdfA_3b; //Задаем стандарт PDF файла pdf.OpenAfterExport = true; //Открыть файл после экспорта pdf.AddEmbeddedXML("ZUGFeRD-invoice.xml", "ZUGFeRD invoice", DateTime.Now, file); //Вложить xml файл в PDF документ report.Export(pdf, saveDialog.FileName); //Выполнить экспорт отчета } } } } else MessageBox.Show("Report file does not exist!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } else MessageBox.Show("XML file does not exist!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } |
Из комментариев к коду понятно, что мы выполняем экспорт заранее созданного отчета в PDF. При этом, устанавливаем стандарт PDF/A-3 и добавляем в документ xml файл счета стандарта ZUGFeRD.
Давайте рассмотрим шаблон отчета, который, представляет собой счет-фактуру, оформленную по стандартам ZUGFeRD.
Для генерации XML представления этого отчета нужно использовать библиотеку, которую можно найти тут: https://www.nuget.org/packages/ZUGFeRD-csharp/.
С помощью кода и библиотеки ZUGFeRD-csharp мы генерируем вот такой XML файл:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
<?xml version="1.0" encoding="UTF-8"?><rsm:CrossIndustryDocument xmlns:rsm="urn:ferd:CrossIndustryDocument:invoice:1p0" xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:15" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <rsm:SpecifiedExchangedDocumentContext> <ram:TestIndicator> <udt:Indicator>true</udt:Indicator> </ram:TestIndicator> <ram:GuidelineSpecifiedDocumentContextParameter> <ram:ID>urn:ferd:CrossIndustryDocument:invoice:1p0:basic</ram:ID> </ram:GuidelineSpecifiedDocumentContextParameter> </rsm:SpecifiedExchangedDocumentContext> <rsm:HeaderExchangedDocument> <ram:ID>2017-415</ram:ID> <ram:Name>Rechnung</ram:Name> <ram:TypeCode>380</ram:TypeCode> <ram:IssueDateTime> <udt:DateTimeString format="102">20170320</udt:DateTimeString> </ram:IssueDateTime> <ram:IncludedNote> <ram:Content>Created by FastReport.Net https://www.fast-report.com</ram:Content> </ram:IncludedNote> </rsm:HeaderExchangedDocument> <rsm:SpecifiedSupplyChainTradeTransaction> <ram:ApplicableSupplyChainTradeAgreement> <ram:SellerTradeParty> <ram:Name>Haimerl Datentechnik</ram:Name> <ram:PostalTradeAddress> <ram:PostcodeCode>94356</ram:PostcodeCode> <ram:LineOne>Kreuzacker 10</ram:LineOne> <ram:CityName>Kirchroth / Kössnach</ram:CityName> <ram:CountryID>DE</ram:CountryID> </ram:PostalTradeAddress> <ram:SpecifiedTaxRegistration> <ram:ID schemeID="VA">DE179151914</ram:ID> </ram:SpecifiedTaxRegistration> </ram:SellerTradeParty> <ram:BuyerTradeParty> <ram:Name>ABB Lackieranlagen GmbH</ram:Name> <ram:PostalTradeAddress> <ram:PostcodeCode>35510</ram:PostcodeCode> <ram:LineOne>Schorbachstrasse 9</ram:LineOne> <ram:CityName>Butzbach</ram:CityName> <ram:CountryID>DE</ram:CountryID> </ram:PostalTradeAddress> </ram:BuyerTradeParty> </ram:ApplicableSupplyChainTradeAgreement> <ram:ApplicableSupplyChainTradeDelivery> <ram:ActualDeliverySupplyChainEvent> <ram:OccurrenceDateTime> <udt:DateTimeString format="102">20170320</udt:DateTimeString> </ram:OccurrenceDateTime> </ram:ActualDeliverySupplyChainEvent> </ram:ApplicableSupplyChainTradeDelivery> <ram:ApplicableSupplyChainTradeSettlement> <ram:PaymentReference>2017-415</ram:PaymentReference> <ram:InvoiceCurrencyCode>EUR</ram:InvoiceCurrencyCode> <ram:ApplicableTradeTax> <ram:CalculatedAmount currencyID="EUR">160.93</ram:CalculatedAmount> <ram:TypeCode>VAT</ram:TypeCode> <ram:BasisAmount currencyID="EUR">847.00</ram:BasisAmount> <ram:ApplicablePercent>19.0</ram:ApplicablePercent> </ram:ApplicableTradeTax> <ram:SpecifiedTradeSettlementMonetarySummation> <ram:LineTotalAmount currencyID="EUR">847.00</ram:LineTotalAmount> <ram:ChargeTotalAmount currencyID="EUR">0</ram:ChargeTotalAmount> <ram:AllowanceTotalAmount currencyID="EUR">0</ram:AllowanceTotalAmount> <ram:TaxBasisTotalAmount currencyID="EUR">847.00</ram:TaxBasisTotalAmount> <ram:TaxTotalAmount currencyID="EUR">160.93</ram:TaxTotalAmount> <ram:GrandTotalAmount currencyID="EUR">1007.93</ram:GrandTotalAmount> </ram:SpecifiedTradeSettlementMonetarySummation> </ram:ApplicableSupplyChainTradeSettlement> <ram:IncludedSupplyChainTradeLineItem> <ram:AssociatedDocumentLineDocument/> <ram:SpecifiedSupplyChainTradeDelivery> <ram:BilledQuantity unitCode="C62">1</ram:BilledQuantity> </ram:SpecifiedSupplyChainTradeDelivery> <ram:SpecifiedSupplyChainTradeSettlement/> <ram:SpecifiedTradeProduct> <ram:Name>FastReport.Net Professional Edition Single License</ram:Name> </ram:SpecifiedTradeProduct> </ram:IncludedSupplyChainTradeLineItem> <ram:IncludedSupplyChainTradeLineItem> <ram:AssociatedDocumentLineDocument/> <ram:SpecifiedSupplyChainTradeDelivery> <ram:BilledQuantity unitCode="C62">2</ram:BilledQuantity> </ram:SpecifiedSupplyChainTradeDelivery> <ram:SpecifiedSupplyChainTradeSettlement/> <ram:SpecifiedTradeProduct> <ram:Name>FastReport.Net Win+WebForms Edition Single License</ram:Name> </ram:SpecifiedTradeProduct> </ram:IncludedSupplyChainTradeLineItem> </rsm:SpecifiedSupplyChainTradeTransaction> </rsm:CrossIndustryDocument> |
Запускаем программу:
Выбираем xml-файл счет-фактуры. Нажимаем кнопку Create PDF/A-3b with embedded XML. А вот так выглядит человеко-читаемое представление документа, собственно сам PDF документ:
Таким образом, для использования xml представления ZUGFeRD совместно с отчетом FastReport нужно всего лишь выполнить экспорт отчета в PDF формата A-3 и прикрепить xml файл.