diff --git a/mustang/doc/MustangDev.en.odt b/mustang/doc/MustangDev.en.odt
new file mode 100644
index 00000000..7cc7c98d
Binary files /dev/null and b/mustang/doc/MustangDev.en.odt differ
diff --git a/mustang/doc/MustangWriter.java b/mustang/doc/MustangWriter.java
new file mode 100644
index 00000000..ceed24e7
--- /dev/null
+++ b/mustang/doc/MustangWriter.java
@@ -0,0 +1,277 @@
+package zugferd;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.Calendar;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.pdfbox.exceptions.COSVisitorException;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.mustangproject.ZUGFeRD.IZUGFeRDExportableContact;
+import org.mustangproject.ZUGFeRD.IZUGFeRDExportableItem;
+import org.mustangproject.ZUGFeRD.IZUGFeRDExportableProduct;
+import org.mustangproject.ZUGFeRD.IZUGFeRDExportableTransaction;
+import org.mustangproject.ZUGFeRD.ZUGFeRDExporter;
+
+class Contact implements IZUGFeRDExportableContact {
+
+ @Override
+ public String getCountry() {
+ return "DE";
+ }
+
+ @Override
+ public String getLocation() {
+ return "Spielkreis";
+ }
+
+ @Override
+ public String getName() {
+ return "Theodor Est";
+ }
+
+ @Override
+ public String getStreet() {
+ return "Bahnstr. 42";
+ }
+
+ @Override
+ public String getVATID() {
+ return "DE999999999";
+ }
+
+ @Override
+ public String getZIP() {
+ return "88802";
+ }
+}
+
+class Item implements IZUGFeRDExportableItem {
+ private BigDecimal price, quantity;
+
+ public Item(BigDecimal price, BigDecimal quantity, Product product) {
+ super();
+ this.price = price;
+ this.quantity = quantity;
+ this.product = product;
+ }
+
+ private Product product;
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+
+ public BigDecimal getQuantity() {
+ return quantity;
+ }
+
+ public void setQuantity(BigDecimal quantity) {
+ this.quantity = quantity;
+ }
+
+ public Product getProduct() {
+ return product;
+ }
+
+ public void setProduct(Product product) {
+ this.product = product;
+ }
+
+}
+
+class Product implements IZUGFeRDExportableProduct {
+ private String description, name, unit;
+
+ public Product(String description, String name, String unit,
+ BigDecimal VATPercent) {
+ super();
+ this.description = description;
+ this.name = name;
+ this.unit = unit;
+ this.VATPercent = VATPercent;
+ }
+
+ private BigDecimal VATPercent;
+
+ @Override
+ public String getDescription() {
+ return description;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String getUnit() {
+ return unit;
+ }
+
+ @Override
+ public BigDecimal getVATPercent() {
+ return VATPercent;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+
+ public void setVATPercent(BigDecimal vATPercent) {
+ VATPercent = vATPercent;
+ }
+}
+
+public class MustangWriter implements IZUGFeRDExportableTransaction {
+
+ public static void main(String[] args) {
+ MustangWriter w=new MustangWriter();
+ w.apply();
+ }
+
+ @Override
+ public Date getDeliveryDate() {
+ return new GregorianCalendar(2015, Calendar.OCTOBER, 7).getTime();
+ }
+
+ @Override
+ public Date getDueDate() {
+ return new GregorianCalendar(2015, Calendar.OCTOBER, 29).getTime();
+ }
+
+ @Override
+ public Date getIssueDate() {
+ return new GregorianCalendar(2015, Calendar.OCTOBER, 8).getTime();
+ }
+
+ @Override
+ public String getNumber() {
+ return "RE-20151008/504";
+ }
+
+ @Override
+ public String getOwnBIC() {
+ return "COBADEFXXX";
+ }
+
+ @Override
+ public String getOwnBankName() {
+ return "Commerzbank";
+ }
+
+ @Override
+ public String getOwnCountry() {
+ return "DE";
+ }
+
+ @Override
+ public String getOwnIBAN() {
+ return "DE88 2008 0000 0970 3757 00";
+ }
+
+ @Override
+ public String getOwnLocation() {
+ return "Stadthausen";
+ }
+
+ @Override
+ public String getOwnOrganisationName() {
+ return "Bei Spiel GmbH";
+ }
+
+ @Override
+ public String getOwnStreet() {
+ return "Ecke 12";
+ }
+
+ @Override
+ public String getOwnTaxID() {
+ return "22/815/0815/4";
+ }
+
+ @Override
+ public String getOwnVATID() {
+ return "DE136695976";
+ }
+
+ @Override
+ public String getOwnZIP() {
+ return "12345";
+ }
+
+ @Override
+ public IZUGFeRDExportableContact getRecipient() {
+ return new Contact();
+ }
+
+
+ @Override
+ public IZUGFeRDExportableItem[] getZFItems() {
+ Item[] allItems = new Item[3];
+ Product designProduct = new Product("",
+ "Künstlerische Gestaltung (Stunde)", "HUR", new BigDecimal(
+ "7.000000"));
+ Product balloonProduct = new Product("", "Luftballon", "C62",
+ new BigDecimal("19.000000"));
+ Product airProduct = new Product("", "Heiße Luft pro Liter", "LTR",
+ new BigDecimal("19.000000"));
+ allItems[0] = new Item(new BigDecimal("160"),
+ new BigDecimal("1"), designProduct);
+ allItems[1] = new Item(new BigDecimal("0.79"),
+ new BigDecimal("400"), balloonProduct);
+ allItems[2] = new Item(new BigDecimal("0.10"),
+ new BigDecimal("200"), airProduct);
+ return allItems;
+ }
+
+ private void apply() {
+ PDDocument doc;
+ try {
+ System.out.println("Reading blank PDF");
+ doc = PDDocument
+ .load("/Users/jstaerk/workspace/zugferd/MustangGnuaccountingBeispielRE-20151008_504blanko.pdf");
+ ZUGFeRDExporter ze = new ZUGFeRDExporter();
+ System.out.println("Converting to PDF/A-3u");
+ ze.PDFmakeA3compliant(doc, "Mustangproject",
+ System.getProperty("user.name"), true);
+ System.out.println("Generating and attaching ZUGFeRD-Data");
+ ze.setTest();
+ ze.PDFattachZugferdFile(doc, this);
+ System.out.println("Writing ZUGFeRD-PDF");
+
+ doc.save("/Users/jstaerk/workspace/zugferd/MustangGnuaccountingBeispielRE-20151008_504.pdf");
+ System.out.println("Done.");
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (TransformerException e) {
+ e.printStackTrace();
+ } catch (COSVisitorException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public String getOwnOrganisationFullPlaintextInfo() {
+ return "Bei Spiel GmbH\n"
+ + "Ecke 12\n"
+ + "12345 Stadthausen\n"
+ + "Geschäftsführer: Max Mustermann";
+ }
+
+}
diff --git a/mustang/doc/ZugferdDev.de.odt b/mustang/doc/ZugferdDev.de.odt
index 1efcd4fe..29d40ea6 100644
Binary files a/mustang/doc/ZugferdDev.de.odt and b/mustang/doc/ZugferdDev.de.odt differ
diff --git a/mustang/doc/ZugferdDev.de.pdf b/mustang/doc/ZugferdDev.de.pdf
index 6044fe58..b6166af7 100644
Binary files a/mustang/doc/ZugferdDev.de.pdf and b/mustang/doc/ZugferdDev.de.pdf differ
diff --git a/mustang/doc/ZugferdDev.en.odt b/mustang/doc/ZugferdDev.en.odt
index 2b509a64..c47a9034 100644
Binary files a/mustang/doc/ZugferdDev.en.odt and b/mustang/doc/ZugferdDev.en.odt differ
diff --git a/mustang/doc/ZugferdDev.en.pdf b/mustang/doc/ZugferdDev.en.pdf
index f215bf18..9c680f8f 100644
Binary files a/mustang/doc/ZugferdDev.en.pdf and b/mustang/doc/ZugferdDev.en.pdf differ
diff --git a/mustang/pom.xml b/mustang/pom.xml
index 2876dbb6..ffd47561 100644
--- a/mustang/pom.xml
+++ b/mustang/pom.xml
@@ -8,7 +8,7 @@
org.mustangproject.ZUGFeRD
mustang
- 1.1.3-SNAPSHOT
+ 1.2.0
jar
Mustang
diff --git a/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java b/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java
index 050d0272..48d485a7 100644
--- a/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java
+++ b/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java
@@ -10,7 +10,6 @@ package org.mustangproject.ZUGFeRD;
-import java.math.BigDecimal;
import java.util.Date;
public interface IZUGFeRDExportableTransaction {
@@ -27,6 +26,19 @@ public interface IZUGFeRDExportableTransaction {
*/
Date getIssueDate();
+ /**
+ * this should be the full sender institution name, details, manager and tax registration like.
+ * It is one of the few functions which may return null.
+ *
+ Lieferant GmbH
+ Lieferantenstraße 20
+ 80333 München
+ Deutschland
+ Geschäftsführer: Hans Muster
+ Handelsregisternummer: H A 123
+ * @return
+ */
+ String getOwnOrganisationFullPlaintextInfo();
/**
* when the invoice is to be paid
diff --git a/mustang/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java b/mustang/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java
index 8b168e91..f32bfa7b 100644
--- a/mustang/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java
+++ b/mustang/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java
@@ -66,7 +66,6 @@ public class ZUGFeRDExporter {
private class LineCalc {
private IZUGFeRDExportableItem currentItem=null;
- private BigDecimal priceGross;
private BigDecimal totalGross;
private BigDecimal itemTotalNetAmount;
private BigDecimal itemTotalVATAmount;
@@ -74,17 +73,12 @@ public class ZUGFeRDExporter {
public LineCalc(IZUGFeRDExportableItem currentItem) {
this.currentItem=currentItem;
BigDecimal multiplicator=currentItem.getProduct().getVATPercent().divide(new BigDecimal(100)).add(new BigDecimal(1));
- priceGross=currentItem.getPrice().multiply(multiplicator);
+// priceGross=currentItem.getPrice().multiply(multiplicator);
totalGross=currentItem.getPrice().multiply(multiplicator).multiply(currentItem.getQuantity());
itemTotalNetAmount=currentItem.getQuantity().multiply(currentItem.getPrice()).setScale(2,BigDecimal.ROUND_HALF_UP);
itemTotalVATAmount=totalGross.subtract(itemTotalNetAmount);
}
-/* public BigDecimal getPriceGross() {
- return priceGross;
- }
- public BigDecimal getTotalGross() {
- return totalGross;
- }*/
+
public BigDecimal getItemTotalNetAmount() {
return itemTotalNetAmount;
}
@@ -271,6 +265,17 @@ public class ZUGFeRDExporter {
if (isTest) {
testBooleanStr="true";
+ }
+ String senderReg="";
+ if (trans.getOwnOrganisationFullPlaintextInfo()!=null) {
+ senderReg=""
+ + "\n"
+ + " \n"
+ + trans.getOwnOrganisationFullPlaintextInfo()
+ + " \n"
+ + "REG\n"
+ + "\n";
+
}
String xml= "\n" //$NON-NLS-1$
@@ -289,6 +294,7 @@ public class ZUGFeRDExporter {
+ " RECHNUNG\n" //$NON-NLS-1$
+ " 380\n" //$NON-NLS-1$
+ " "+zugferdDateFormat.format(trans.getIssueDate())+"\n" //date format was 20130605 //$NON-NLS-1$ //$NON-NLS-2$
+ + senderReg
// + " \n"
// + " \n"
// + "Rechnung gemäß Bestellung Nr. 2013-471331 vom 01.03.2013.\n"