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"