KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > knowgate > hipergate > Invoice


1 /*
2   Copyright (C) 2003-2005 Know Gate S.L. All rights reserved.
3                            C/Oņa, 107 1š2 28050 Madrid (Spain)
4
5   Redistribution and use in source and binary forms, with or without
6   modification, are permitted provided that the following conditions
7   are met:
8
9   1. Redistributions of source code must retain the above copyright
10      notice, this list of conditions and the following disclaimer.
11
12   2. The end-user documentation included with the redistribution,
13      if any, must include the following acknowledgment:
14      "This product includes software parts from hipergate
15      (http://www.hipergate.org/)."
16      Alternately, this acknowledgment may appear in the software itself,
17      if and wherever such third-party acknowledgments normally appear.
18
19   3. The name hipergate must not be used to endorse or promote products
20      derived from this software without prior written permission.
21      Products derived from this software may not be called hipergate,
22      nor may hipergate appear in their name, without prior written
23      permission.
24
25   This library is distributed in the hope that it will be useful,
26   but WITHOUT ANY WARRANTY; without even the implied warranty of
27   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
28
29   You should have received a copy of hipergate License with this code;
30   if not, visit http://www.hipergate.org or mail to info@hipergate.org
31 */

32
33 package com.knowgate.hipergate;
34
35 import java.sql.Statement JavaDoc;
36 import java.sql.PreparedStatement JavaDoc;
37 import java.sql.ResultSet JavaDoc;
38 import java.sql.SQLException JavaDoc;
39 import java.sql.Types JavaDoc;
40
41 import java.util.Date JavaDoc;
42 import java.util.HashMap JavaDoc;
43
44 import java.math.BigDecimal JavaDoc;
45
46 import com.knowgate.dataobjs.*;
47 import com.knowgate.jdc.JDCConnection;
48 import com.knowgate.misc.Gadgets;
49 import com.knowgate.debug.DebugFile;
50
51 /**
52  * @author Sergio Montoro Ten
53  * @version 3.0
54  */

55 public class Invoice extends AbstractOrder {
56
57   private DBSubset oOrders;
58   private Address oShipAddr;
59   private Address oBillAddr;
60
61   // ---------------------------------------------------------------------------
62

63   /**
64    * Default constructor
65    */

66   public Invoice() {
67     super(DB.k_invoices, DB.k_invoice_lines, DB.gu_invoice, "Invoice");
68     oOrders=null;
69     oBillAddr=oShipAddr=null;
70   }
71
72   /**
73    * Create Invoice and set its GUID
74    */

75   public Invoice(String JavaDoc sInvoiceId) {
76     super(DB.k_invoices, DB.k_invoice_lines, DB.gu_invoice, "Invoice");
77     put(DB.gu_invoice, sInvoiceId);
78     oOrders=null;
79     oBillAddr=oShipAddr=null;
80   }
81
82   /**
83    * Load Invoice from database
84    * @param oConn JDCConnection
85    * @param sInvoiceId String Invoice GUID
86    * @throws SQLException
87    */

88   public Invoice(JDCConnection oConn, String JavaDoc sInvoiceId)
89     throws SQLException JavaDoc {
90     super(DB.k_invoices, DB.k_invoice_lines, DB.gu_invoice, "Invoice");
91     load(oConn, new Object JavaDoc[]{sInvoiceId});
92   }
93
94   // ---------------------------------------------------------------------------
95

96   /**
97    *
98    * @param oConn JDCConnection
99    * @param iInvoicePg int Invoice number (as at pg_invoice column of k_invoices table)
100    * @param sWorkArea String WorkArea to which invoice belongs (as at gu_workarea column of k_invoices table)
101    * @throws SQLException
102    */

103   public Invoice(JDCConnection oConn, int iInvoicePg, String JavaDoc sWorkArea)
104     throws SQLException JavaDoc {
105     super(DB.k_invoices, DB.k_invoice_lines, DB.gu_invoice, "Invoice");
106     String JavaDoc sGuInvoice = getIdFromNumber(oConn, iInvoicePg, sWorkArea);
107     if (null!=sGuInvoice) load(oConn, new Object JavaDoc[]{sGuInvoice});
108   }
109
110   // ---------------------------------------------------------------------------
111

112   /**
113    * <p>Get Orders for this Invoice</p>
114    * Orders can only be get if Invoice has been previously loaded,
115    * else this method will return <b>null</b>
116    * @return String[] Array with orders GUIDs
117    */

118   public String JavaDoc[] getOrders() {
119     if (oOrders==null)
120       return null;
121     else {
122       String JavaDoc [] aRetVal = new String JavaDoc[oOrders.getRowCount()];
123       for (int o=0; o<oOrders.getRowCount(); o++)
124         aRetVal[o] = oOrders.getString(0,o);
125       return aRetVal;
126     }
127   }
128
129   // ---------------------------------------------------------------------------
130

131   /**
132    * Load Invoice with its associated Order and Addresses
133    * @param oConn JDCConnection
134    * @param PKVals Array with a single element Object[1]{(String)gu_invoice}
135    * @return boolean <b>true</b> is Invoice was found, <b>false</b> otherwise
136    * @throws SQLException
137    */

138   public boolean load(JDCConnection oConn, Object JavaDoc[] PKVals) throws SQLException JavaDoc {
139     boolean bRetVal = super.load(oConn, PKVals);
140     if (bRetVal) {
141       oOrders = new DBSubset(DB.k_x_orders_invoices, DB.gu_order, DB.gu_invoice + "=?", 1);
142       if (DBBind.exists(oConn, DB.k_x_orders_invoices, "U")) {
143         oOrders.load(oConn, PKVals);
144       }
145       if (!isNull(DB.gu_ship_addr))
146         oShipAddr = new Address(oConn, getString(DB.gu_ship_addr));
147       if (!isNull(DB.gu_bill_addr))
148         oShipAddr = new Address(oConn, getString(DB.gu_bill_addr));
149       else
150         oShipAddr = null;
151       if (!isNull(DB.gu_bill_addr))
152         oBillAddr = new Address(oConn, getString(DB.gu_bill_addr));
153       if (!isNull(DB.gu_ship_addr))
154         oShipAddr = new Address(oConn, getString(DB.gu_ship_addr));
155       else
156         oBillAddr = null;
157     }
158     return bRetVal;
159   } // load
160

161   // ---------------------------------------------------------------------------
162

163   /**
164    * <p>Store invoice</p>
165    * If no value for gu_invoice is specified then a new one is automatically assigned.<br>
166    * If no value for pg_invoice is specified then a new one is automatically assigned by looking at k_invoices_next table and updating it afterwards.<br>
167    * This method updates dt_modified to current datetime as a side effect iif Invoice did not previously exist at the database.<br>
168    * @param oConn JDCConnection
169    * @return boolean
170    * @throws SQLException
171    */

172   public boolean store(JDCConnection oConn) throws SQLException JavaDoc {
173     java.sql.Timestamp JavaDoc dtNow = new java.sql.Timestamp JavaDoc(DBBind.getTime());
174
175     if (DebugFile.trace) {
176       DebugFile.writeln("Begin Invoice.store([JDCConnection])");
177       DebugFile.incIdent();
178     }
179
180     if (!AllVals.containsKey(DB.gu_invoice))
181       AllVals.put(DB.gu_invoice,Gadgets.generateUUID());
182     else
183       replace(DB.dt_modified, dtNow);
184
185     if (!AllVals.containsKey(DB.pg_invoice) && AllVals.containsKey(DB.gu_workarea)) {
186       AllVals.put(DB.pg_invoice, new Integer JavaDoc(nextVal(oConn, (String JavaDoc) AllVals.get(DB.gu_workarea))));
187     } // fi (gu_workarea AND NOT pg_invoice)
188

189     if (!AllVals.containsKey(DB.id_legal)) {
190       PreparedStatement JavaDoc oStmt;
191       ResultSet JavaDoc oRSet;
192       String JavaDoc sLegalId = null;
193       if (AllVals.containsKey(DB.gu_contact)) {
194         oStmt = oConn.prepareStatement("SELECT "+DB.sn_passport+" FROM "+DB.k_contacts+ " WHERE "+DB.gu_contact+"=?",
195                                        ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
196         oStmt.setString(1, getString(DB.gu_contact));
197         oRSet = oStmt.executeQuery();
198         if (oRSet.next())
199           sLegalId = oRSet.getString(1);
200         oRSet.close();
201         oStmt.close();
202       } // fi (gu_contact!=null)
203
if ((sLegalId==null) && AllVals.containsKey(DB.gu_company)) {
204         oStmt = oConn.prepareStatement("SELECT "+DB.id_legal+" FROM "+DB.k_companies+ " WHERE "+DB.gu_company+"=?",
205                                        ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
206         oStmt.setString(1, getString(DB.gu_company));
207         oRSet = oStmt.executeQuery();
208         if (oRSet.next())
209           sLegalId = oRSet.getString(1);
210         oRSet.close();
211         oStmt.close();
212       }
213       if (sLegalId!=null) put(DB.id_legal, sLegalId);
214     } // fi
215

216     boolean bRetVal = super.store(oConn);
217
218     if (DebugFile.trace) {
219       DebugFile.decIdent();
220       DebugFile.writeln("End Invoice.store() : " + String.valueOf(bRetVal));
221     }
222     return bRetVal;
223   } // store
224

225   //----------------------------------------------------------------------------
226

227   /**
228    * <p>Add or update an Invoice line</p>
229    * This method updates k_invoices.dt_modified to current datetime as a side effect
230    * @param oConn JDCConnection
231    * @param iLine int Line Number
232    * @param oPrSale BigDecimal Sale price for one unit
233    * @param fQuantity float Number of units sold
234    * @param sIdUnit String Measure Unit Identifier, if <b>null</b> then is set to "UNIT" by default
235    * @param oPrTotal BigDecimal Total price (oPrSale*fQuantity+oPrSale*fQuantity*fTaxRate)
236    * @param fTaxRate float Percentage of taxes [0..0.99]
237    * @param bTaxIncluded short 1 if oPrSale includes taxes 0 if not
238    * @param sNmProduct String Product Name
239    * @param sGuProduct String Product GUID (from k_product.gu_product)
240    * @param sGuItem String Item GUID (for products that require a serial number to be assigned when sold)
241    * @param sTxPromo String Promotions (free text)
242    * @param sTxOptions String Other Options (free text)
243    * @return boolean
244    * @throws SQLException
245    */

246   public boolean storeLine(JDCConnection oConn, int iLine, BigDecimal JavaDoc oPrSale,
247                            float fQuantity, String JavaDoc sIdUnit, BigDecimal JavaDoc oPrTotal,
248                            float fTaxRate, short bTaxIncluded, String JavaDoc sNmProduct,
249                            String JavaDoc sGuProduct, String JavaDoc sGuItem, String JavaDoc sTxPromo,
250                            String JavaDoc sTxOptions)
251     throws SQLException JavaDoc {
252
253     PreparedStatement JavaDoc oStmt = oConn.prepareStatement("UPDATE "+DB.k_invoices+" SET "+DB.dt_modified+"="+DBBind.Functions.GETDATE+" WHERE "+DB.gu_invoice+"=?");
254     oStmt.setObject(1, get(DB.gu_invoice), Types.CHAR);
255     oStmt.executeUpdate();
256     oStmt.close();
257
258     InvoiceLine oLine = new InvoiceLine();
259     oLine.put(DB.gu_invoice, getString(DB.gu_invoice));
260     oLine.put(DB.pg_line, iLine);
261     oLine.put(DB.pr_sale, oPrSale);
262     oLine.put(DB.nu_quantity, fQuantity);
263     oLine.put(DB.id_unit, (sIdUnit==null) ? "UNIT" : sIdUnit);
264     oLine.put(DB.pr_total, oPrTotal);
265     oLine.put(DB.pct_tax_rate, fTaxRate);
266     oLine.put(DB.is_tax_included, bTaxIncluded);
267     oLine.put(DB.nm_product, sNmProduct);
268     oLine.put(DB.gu_product, sGuProduct);
269     oLine.put(DB.gu_item, sGuItem);
270     oLine.put(DB.tx_promotion, sTxPromo);
271     oLine.put(DB.tx_options, sTxOptions);
272     return oLine.store(oConn);
273   } // storeLine
274

275   //----------------------------------------------------------------------------
276

277   /**
278    * <p>Add an Invoice line</p>
279    * This method updates k_invoices.dt_modified to current datetime as a side effect
280    * @param oConn JDCConnection
281    * @param oPrSale BigDecimal Sale price for one unit
282    * @param fQuantity float Number of units sold
283    * @param sIdUnit String Measure Unit Identifier, if <b>null</b> then is set to "UNIT" by default
284    * @param oPrTotal BigDecimal Total price (oPrSale*fQuantity+oPrSale*fQuantity*fTaxRate)
285    * @param fTaxRate float Percentage of taxes [0..0.99]
286    * @param bTaxIncluded short 1 if oPrSale includes taxes 0 if not
287    * @param sNmProduct String Product Name
288    * @param sGuProduct String Product GUID (from k_product.gu_product)
289    * @param sGuItem String Item GUID (for products that require a serial number to be assigned when sold)
290    * @param sTxPromo String Promotions (free text)
291    * @param sTxOptions String Other Options (free text)
292    * @return int New line number
293    * @throws SQLException
294    */

295   public int addLine (JDCConnection oConn, BigDecimal JavaDoc oPrSale,
296                       float fQuantity, String JavaDoc sIdUnit, BigDecimal JavaDoc oPrTotal,
297                       float fTaxRate, short bTaxIncluded, String JavaDoc sNmProduct,
298                       String JavaDoc sGuProduct, String JavaDoc sGuItem, String JavaDoc sTxPromo,
299                       String JavaDoc sTxOptions)
300     throws SQLException JavaDoc {
301       int iLine;
302       PreparedStatement JavaDoc oStmt = oConn.prepareStatement("SELECT MAX("+DB.pg_line+") FROM "+DB.k_invoice_lines+" WHERE "+DB.gu_invoice+"=?",ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
303       oStmt.setString(1, getStringNull(DB.gu_invoice,null));
304       ResultSet JavaDoc oRSet = oStmt.executeQuery();
305       if (oRSet.next()) {
306         Object JavaDoc oPgLine = oRSet.getObject(1);
307         if (oRSet.wasNull()) {
308           iLine = 1;
309         } else {
310           iLine = Integer.parseInt(oPgLine.toString());
311         }
312       } else {
313         iLine = 1;
314       }
315       oRSet.close();
316       oStmt.close();
317       storeLine(oConn, iLine, oPrSale, fQuantity, sIdUnit, oPrTotal, fTaxRate, bTaxIncluded, sNmProduct, sGuProduct, sGuItem, sTxPromo, sTxOptions);
318       return iLine;
319     } // addLine
320

321   //----------------------------------------------------------------------------
322

323   /**
324    * <p>Delete Invoice</p>
325    * @param oConn Database Connection
326    * @throws SQLException
327    */

328   public boolean delete (JDCConnection oConn) throws SQLException JavaDoc {
329     boolean bRetVal;
330     Statement JavaDoc oStmt;
331
332     if (DebugFile.trace) {
333       DebugFile.writeln("Begin Invoice.delete([Connection])");
334       DebugFile.incIdent();
335     }
336
337     oStmt = oConn.createStatement();
338
339     oStmt.executeUpdate("DELETE FROM " + DB.k_invoice_lines + " WHERE " + DB.gu_invoice + "='" + getString(DB.gu_invoice) + "' OR "+DB.gu_invoice+" IN (SELECT "+DB.gu_returned+" FROM "+DB.k_returned_invoices+" WHERE "+DB.gu_invoice+"='"+getString(DB.gu_invoice)+"')");
340
341     oStmt.executeUpdate("DELETE FROM " + DB.k_returned_invoices + " WHERE " + DB.gu_invoice + "='" + getString(DB.gu_invoice) + "'");
342
343     oStmt.executeUpdate("DELETE FROM " + DB.k_x_orders_invoices + " WHERE " + DB.gu_invoice + "='" + getString(DB.gu_invoice) + "'");
344
345     oStmt.close();
346
347     bRetVal = super.delete(oConn);
348
349     if (DebugFile.trace) {
350       DebugFile.decIdent();
351       DebugFile.writeln("End Invoice.delete() : " + String.valueOf(bRetVal));
352     }
353
354     return bRetVal;
355   } // delete
356

357   // ---------------------------------------------------------------------------
358

359   /**
360    * Get invoice line by number
361    * @param oConn JDCConnection
362    * @param iPgLine int Line number [1..n] as at k_invoice_lines.pg_line
363    * @return InvoiceLine or <b>null</b> if no line with such number was found
364    * @throws SQLException
365    */

366   public InvoiceLine getLine(JDCConnection oConn, int iPgLine) throws SQLException JavaDoc {
367     InvoiceLine oRetVal = new InvoiceLine();
368     if (oRetVal.load(oConn, new Object JavaDoc[]{getStringNull(DB.gu_invoice,null),new Integer JavaDoc(iPgLine)}))
369       return oRetVal;
370     else
371       return null;
372   } // getLine()
373

374   // ---------------------------------------------------------------------------
375

376   /**
377    * Get a DBSubset with all lines of this Invoice
378    * @param oConn JDCConnection
379    * @return DBSubset with columns gu_invoice,pg_line,pr_sale,nu_quantity,id_unit,pr_total,pct_tax_rate,is_tax_included,nm_product,gu_product,gu_item,tx_promotion,tx_options
380    * @throws SQLException
381    */

382   public DBSubset getLines(JDCConnection oConn) throws SQLException JavaDoc {
383
384     oLines = new DBSubset(DB.k_invoice_lines,
385                           DB.gu_invoice+","+DB.pg_line+","+DB.pr_sale+","+
386                           DB.nu_quantity+","+DB.id_unit+","+DB.pr_total+","+
387                           DB.pct_tax_rate+","+DB.is_tax_included+","+
388                           DB.nm_product+","+ DB.gu_product+","+
389                           DB.gu_item+","+DB.tx_promotion+","+DB.tx_options,
390                           DB.gu_invoice + "=? ORDER BY 2", 10);
391
392     oLines.load(oConn, new Object JavaDoc[]{getString(DB.gu_invoice)});
393
394     return oLines;
395   } // getLines()
396

397   // ---------------------------------------------------------------------------
398

399   /**
400    * <p>Get invoice as an XML document</p>
401    * Character encoding is set to UTF-8
402    * @param oConn JDCConnection Openend JDBC database connection
403    * @param sLocale String Locale for output formatting
404    * @return An XML String formatted according to OASIS Universal Universal Business Language Specification<br>
405    * <b>Sample output</b><br>
406    * &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>
407    * &lt;Invoice xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0" xmlns:cur="urn:oasis:names:specification:ubl:schema:xsd:CurrencyCode-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;<br>
408    * &nbsp;&nbsp;&lt;ID&gt;1&lt;/ID&gt;<br>
409    * &nbsp;&nbsp;&lt;GUID&gt;7f000001106832df692100000a45e2d8&lt;/GUID&gt;<br>
410    * &nbsp;&nbsp;&lt;cbc:IssueDate/&gt;<br>
411    * &nbsp;&nbsp;&lt;InvoiceCurrencyCode&gt;840&lt;/InvoiceCurrencyCode&gt;<br>
412    * &nbsp;&nbsp;&lt;LineItemCountNumeric&gt;2&lt;/LineItemCountNumeric&gt;<br>
413    * &nbsp;&nbsp;&lt;cac:OrderReference&gt;<br>
414    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:BuyersID&gt;&lt;![CDATA[B82568718]]&gt;&lt;/cac:BuyersID&gt;<br>
415    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:SellerID&gt;&lt;![CDATA[B82568718]]&gt;&lt;/cac:SellerID&gt;<br>
416    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;DocumentStatusCode&gt;&lt;![CDATA[]]&gt;&lt;/DocumentStatusCode&gt;<br>
417    * &nbsp;&nbsp;&lt;/cac:OrderReference&gt;<br>
418    * &nbsp;&nbsp;&lt;cac:BuyerParty&gt;<br>
419    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:Party&gt;<br>
420    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:PartyName&gt;&lt;cbc:Name&gt;&lt;![CDATA[Paul Klein]]&gt;&lt;/cbc:Name&gt;&lt;/cac:PartyName&gt;<br>
421    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:Address&gt;<br>
422    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ID&gt;7f000001106709e1bda10000ec419d26&lt;/ID&gt;<br>
423    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:PostBox&gt;&lt;/cbc:PostBox&gt;<br>
424    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:StreetName&gt;&lt;![CDATA[Bulbury]]&gt;&lt;/cbc:StreetName&gt;<br>
425    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:AdditionalStreetName&gt;&lt;![CDATA[ST]]&gt;&lt;/cbc:AdditionalStreetName&gt;<br>
426    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:BuildingName&gt;&lt;![CDATA[]]&gt;&lt;/cbc:BuildingName&gt;<br>
427    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:BuildingNumber&gt;&lt;![CDATA[80]]&gt;&lt;/cbc:BuildingNumber&gt;<br>
428    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:CityName&gt;&lt;![CDATA[]]&gt;&lt;/cbc:CityName&gt;<br>
429    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:PostalZone&gt;&lt;/cbc:PostalZone&gt;<br>
430    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:CountrySubentity&gt;&lt;![CDATA[]]&gt;&lt;/cbc:CountrySubentity&gt;<br>
431    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:CountrySubentityCode&gt;&lt;/cbc:CountrySubentityCode&gt;<br>
432    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:AddressLine&gt;&lt;![CDATA[]]&gt;&lt;/cbc:AddressLine&gt;<br>
433    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Country&gt;&lt;![CDATA[]]&gt;&lt;/Country&gt;<br>
434    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/cac:Address&gt;<br>
435    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/cac:Party&gt;<br>
436    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:AccountsContact&gt;<br>
437    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:Name&gt;&lt;![CDATA[]]&gt;&lt;/cbc:Name&gt;<br>
438    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:Telephone&gt;&lt;![CDATA[]]&gt;&lt;/cbc:Telephone&gt;<br>
439    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/cac:AccountsContact&gt;<br>
440    * &nbsp;&nbsp;&lt;/cac:BuyerParty&gt;<br>
441    * &nbsp;&nbsp;&lt;cac:SellerParty&gt;<br>
442    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:Party&gt;<br>
443    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:PartyName&gt;&lt;cbc:Name&gt;&lt;![CDATA[Know Gate Ltd.]]&gt;&lt;/cbc:Name&gt;&lt;/cac:PartyName&gt;<br>
444    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:Address&gt;<br>
445    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ID&gt;7f0000011067057c4ef100008c688128&lt;/ID&gt;<br>
446    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:StreetName&gt;&lt;![CDATA[Wesleyan]]&gt;&lt;/cbc:StreetName&gt;<br>
447    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:AdditionalStreetName&gt;&lt;![CDATA[ST]]&gt;&lt;/cbc:AdditionalStreetName&gt;<br>
448    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:BuildingName&gt;&lt;![CDATA[]]&gt;&lt;/cbc:BuildingName&gt;<br>
449    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:BuildingNumber&gt;&lt;![CDATA[107]]&gt;&lt;/cbc:BuildingNumber&gt;<br>
450    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:CityName&gt;&lt;![CDATA[Boston]]&gt;&lt;/cbc:CityName&gt;<br>
451    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:PostalZone&gt;&lt;/cbc:PostalZone&gt;<br>
452    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:CountrySubentity&gt;&lt;![CDATA[MA]]&gt;&lt;/cbc:CountrySubentity&gt;<br>
453    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:CountrySubentityCode&gt;&lt;/cbc:CountrySubentityCode&gt;<br>
454    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:AddressLine&gt;&lt;![CDATA[]]&gt;&lt;/cbc:AddressLine&gt;<br>
455    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Country&gt;&lt;![CDATA[United States]]&gt;&lt;/Country&gt;<br>
456    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/cac:Address&gt;<br>
457    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/cac:Party&gt;<br>
458    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:AccountsContact&gt;<br>
459    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;cbc:Name&gt;&lt;![CDATA[]]&gt;&lt;/cbc:Name&gt;<br>
460    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;cbc:Telephone&gt;&lt;![CDATA[]]&gt;&lt;/cbc:Telephone&gt;<br>
461    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/cac:AccountsContact&gt;<br>
462    * &nbsp;&nbsp;&lt;/cac:SellerParty&gt;<br>
463    * &nbsp;&nbsp;&lt;cac:PaymentMeans&gt;<br>
464    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:DuePaymentDate&gt;2005-09-30&lt;/cbc:DuePaymentDate&gt;<br>
465    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;PayeeFinancialAccount&gt;<br>
466    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ID&gt;00018888XX1234567890&lt;/ID&gt;<br>
467    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;FinancialInstitutionBranch&gt;&lt;![CDATA[1st Boston Bank]]&gt;&lt;/FinancialInstitutionBranch&gt;<br>
468    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/PayeeFinancialAccount&gt;<br>
469    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;PayerFinancialAccount&gt;<br>
470    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ID&gt;&lt;/ID&gt;<br>
471    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;FinancialInstitutionBranch&gt;&lt;![CDATA[]]&gt;&lt;/FinancialInstitutionBranch&gt;<br>
472    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/PayerFinancialAccount&gt;<br>
473    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;Payment&gt;<br>
474    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ID/&gt;<br>
475    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;PaidAmount&gt;268&lt;/PaidAmount&gt;<br>
476    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:ReceivedDate&gt;&lt;/cbc:ReceivedDate&gt;<br>
477    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/Payment&gt;<br>
478    * &nbsp;&nbsp;&lt;/cac:PaymentMeans&gt;<br>
479    * &nbsp;&nbsp;&lt;cac:Delivery&gt;<br>
480    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:DeliveryAddress&gt;<br>
481    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ID&gt;7f00000110670211e12100002a4874df&lt;/ID&gt;<br>
482    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:StreetName&gt;&lt;![CDATA[Yokohama]]&gt;&lt;/cbc:StreetName&gt;<br>
483    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:AdditionalStreetName&gt;&lt;![CDATA[ST]]&gt;&lt;/cbc:AdditionalStreetName&gt;<br>
484    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:BuildingName&gt;&lt;![CDATA[]]&gt;&lt;/cbc:BuildingName&gt;<br>
485    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:BuildingNumber&gt;&lt;![CDATA[1310]]&gt;&lt;/cbc:BuildingNumber&gt;<br>
486    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:CityName&gt;&lt;![CDATA[]]&gt;&lt;/cbc:CityName&gt;<br>
487    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:PostalZone&gt;&lt;/cbc:PostalZone&gt;<br>
488    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:CountrySubentity&gt;&lt;![CDATA[]]&gt;&lt;/cbc:CountrySubentity&gt;<br>
489    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:CountrySubentityCode&gt;&lt;/cbc:CountrySubentityCode&gt;<br>
490    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:AddressLine&gt;&lt;![CDATA[]]&gt;&lt;/cbc:AddressLine&gt;<br>
491    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Country&gt;&lt;![CDATA[us]]&gt;&lt;/Country&gt;<br>
492    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/cac:DeliveryAddress&gt;<br>
493    * &nbsp;&nbsp;&lt;/cac:Delivery&gt;<br>
494    * &nbsp;&nbsp;&lt;cac:TaxTotal&gt;<br>
495    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:TotalTaxAmount amountCurrencyCodeListVersionID="0.3" amountCurrencyID="840"&gt;0&lt;/cbc:TotalTaxAmount&gt;<br>
496    * &nbsp;&nbsp;&lt;/cac:TaxTotal&gt;<br>
497    * &nbsp;&nbsp;&lt;cac:LegalTotal&gt;<br>
498    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:LineExtensionTotalAmount amountCurrencyCodeListVersionID="0.3" amountCurrencyID="840"&gt;248.00&lt;/cbc:LineExtensionTotalAmount&gt;<br>
499    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:TaxInclusiveTotalAmount amountCurrencyCodeListVersionID="0.3" amountCurrencyID="840"&gt;268.00&lt;/cbc:TaxInclusiveTotalAmount&gt;<br>
500    * &nbsp;&nbsp;&lt;/cac:LegalTotal&gt;<br>
501    * &nbsp;&nbsp;&lt;cac:InvoiceLine&gt;<br>
502    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;ID&gt;1&lt;/ID&gt;<br>
503    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:InvoicedQuantity&gt;1&lt;/cbc:InvoicedQuantity&gt;<br>
504    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:LineExtensionAmount amountCurrencyCodeListVersionID="0.3" amountCurrencyID="840"&gt;49.00&lt;/cbc:LineExtensionAmount&gt;<br>
505    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:Item&gt;<br>
506    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;cbc:Description&gt;&lt;![CDATA[Tux Earrings]]&gt;&lt;/cbc:Description&gt;<br>
507    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/cac:Item&gt;<br>
508    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;BasePrice&gt;49.00&lt;/BasePrice&gt;<br>
509    * &nbsp;&nbsp;&lt;/cac:InvoiceLine&gt;<br>
510    * &nbsp;&nbsp;&lt;cac:InvoiceLine&gt;<br>
511    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;ID&gt;2&lt;/ID&gt;<br>
512    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:InvoicedQuantity&gt;1&lt;/cbc:InvoicedQuantity&gt;<br>
513    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:LineExtensionAmount amountCurrencyCodeListVersionID="0.3" amountCurrencyID="840"&gt;199.00&lt;/cbc:LineExtensionAmount&gt;<br>
514    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;cac:Item&gt;<br>
515    * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;cbc:Description&gt;&lt;![CDATA[Tux Pendant]]&gt;&lt;/cbc:Description&gt;<br>
516    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;/cac:Item&gt;<br>
517    * &nbsp;&nbsp;&nbsp;&nbsp;&lt;BasePrice&gt;199.00&lt;/BasePrice&gt;<br>
518    * &nbsp;&nbsp;&lt;/cac:InvoiceLine&gt;<br>
519    * &lt;/Invoice&gt;
520    * @throws IllegalStateException if invoice lines are not loaded or buyer is not set or seller is not set
521    * @see <a HREF="http://docs.oasis-open.org/ubl/cd-UBL-1.0/">OASIS Universal Business Language 1.0</a>
522    */

523   public String JavaDoc toXML(JDCConnection oConn, String JavaDoc sLocale) throws IllegalStateException JavaDoc {
524
525     if (oLines==null) throw new IllegalStateException JavaDoc("Invoice.toXML() Invoice lines not loaded");
526     if (oBuyer==null) throw new IllegalStateException JavaDoc("Invoice.toXML() Buyer party not set");
527     if (oSeller==null) throw new IllegalStateException JavaDoc("Invoice.toXML() Seller party not set");
528
529     if (DebugFile.trace) {
530       DebugFile.writeln("Begin Invoice.toXML([Connection],"+sLocale+")");
531       DebugFile.incIdent();
532     }
533
534     final int iLineCount = oLines.getRowCount();
535     StringBuffer JavaDoc oBfr = new StringBuffer JavaDoc();
536
537     oBfr.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
538     oBfr.append("<Invoice xmlns:cbc=\"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-1.0\" xmlns:cac=\"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-1.0\" xmlns:cur=\"urn:oasis:names:specification:ubl:schema:xsd:CurrencyCode-1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n");
539     // xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-1.0\" xsi:schemaLocation=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-1.0 http://docs.oasis-open.org/ubl/cd-UBL-1.0/xsd/maindoc/UBL-Invoice-1.0.xsd\"
540
oBfr.append(" <ID>"+String.valueOf(getInt(DB.pg_invoice))+"</ID>\n");
541     oBfr.append(" <GUID>"+getString(DB.gu_invoice)+"</GUID>\n");
542     if (isNull(DB.dt_invoiced))
543       oBfr.append(" <cbc:IssueDate/>\n");
544     else
545       oBfr.append(" <cbc:IssueDate>"+getDateShort(DB.dt_invoiced)+"</cbc:IssueDate>\n");
546     oBfr.append(" <InvoiceCurrencyCode>"+getString(DB.id_currency)+"</InvoiceCurrencyCode>\n");
547     oBfr.append(" <LineItemCountNumeric>"+String.valueOf(iLineCount)+"</LineItemCountNumeric>\n");
548     oBfr.append(" <cac:OrderReference>\n");
549     oBfr.append(" <cac:BuyersID><![CDATA["+getStringNull(DB.id_legal,oBuyer.getStringNull(DB.id_legal,oBuyer.getStringNull(DB.sn_passport,"")))+"]]></cac:BuyersID>\n");
550     oBfr.append(" <cac:SellerID><![CDATA["+oSeller.getStringNull(DB.id_legal,oSeller.getStringNull(DB.sn_passport,""))+"]]></cac:SellerID>\n");
551     oBfr.append(" <DocumentStatusCode><![CDATA["+getStringNull(DB.id_status,"")+"]]></DocumentStatusCode>\n");
552     String JavaDoc[] aOrders = getOrders();
553     Order oOrdr;
554     if (aOrders!=null) {
555       try {
556         oOrdr = new Order(oConn, aOrders[0]);
557         if (oOrdr.isNull(DB.dt_invoiced))
558           oBfr.append(" <cbc:IssueDate/>\n");
559         else
560           oBfr.append(" <cbc:IssueDate>"+oOrdr.getDateShort(DB.dt_invoiced)+"</cbc:IssueDate>\n");
561         oBfr.append(" <GUID>"+oOrdr.getString(DB.gu_order)+"</GUID>\n");
562       } catch (Exception JavaDoc ignore) {}
563     } // fi
564
oBfr.append(" </cac:OrderReference>\n");
565     if (DebugFile.trace) DebugFile.writeln("Writting BuyerParty...");
566     oBfr.append(" <cac:BuyerParty>\n");
567     oBfr.append(" <cac:Party>\n");
568     if (oBuyer.isNull(DB.gu_contact))
569       oBfr.append(" <cac:PartyName><cbc:Name><![CDATA["+oBuyer.getString(DB.nm_legal)+"]]></cbc:Name></cac:PartyName>\n");
570     else
571       oBfr.append(" <cac:PartyName><cbc:Name><![CDATA["+oBuyer.getStringNull(DB.tx_name,"")+" "+oBuyer.getStringNull(DB.tx_surname,"")+"]]></cbc:Name></cac:PartyName>\n");
572     oBfr.append(" <cac:Address>\n");
573     if (oBillAddr==null) {
574       oBfr.append(" <ID/>\n");
575       oBfr.append(" <cbc:PostBox/>\n");
576       oBfr.append(" <cbc:StreetName/>\n");
577       oBfr.append(" <cbc:AdditionalStreetName/>\n");
578       oBfr.append(" <cbc:BuildingName/>\n");
579       oBfr.append(" <cbc:BuildingNumber/>\n");
580       oBfr.append(" <cbc:CityName/>\n");
581       oBfr.append(" <cbc:PostalZone/>\n");
582       oBfr.append(" <cbc:CountrySubentity/>\n");
583       oBfr.append(" <cbc:CountrySubentityCode/>\n");
584       oBfr.append(" <cbc:AddressLine/>\n");
585       oBfr.append(" <Country/>\n");
586     } else {
587       oBfr.append(" <ID>"+oBillAddr.getString(DB.gu_address)+"</ID>\n");
588       oBfr.append(" <cbc:PostBox>"+oBillAddr.getStringNull(DB.po_box,"")+"</cbc:PostBox>\n");
589       oBfr.append(" <cbc:StreetName><![CDATA["+oBillAddr.getStringNull(DB.nm_street,"")+"]]></cbc:StreetName>\n");
590       oBfr.append(" <cbc:AdditionalStreetName><![CDATA["+oBillAddr.getStringNull(DB.tp_street,"")+"]]></cbc:AdditionalStreetName>\n");
591       oBfr.append(" <cbc:BuildingName><![CDATA["+oBillAddr.getStringNull(DB.tx_addr2,"")+"]]></cbc:BuildingName>\n");
592       oBfr.append(" <cbc:BuildingNumber><![CDATA["+oBillAddr.getStringNull(DB.nu_street,"")+"]]></cbc:BuildingNumber>\n");
593       oBfr.append(" <cbc:CityName><![CDATA["+oBillAddr.getStringNull(DB.mn_city,"")+"]]></cbc:CityName>\n");
594       oBfr.append(" <cbc:PostalZone>"+oBillAddr.getStringNull(DB.zipcode,"")+"</cbc:PostalZone>\n");
595       oBfr.append(" <cbc:CountrySubentity><![CDATA["+oBillAddr.getStringNull(DB.nm_state,"")+"]]></cbc:CountrySubentity>\n");
596       oBfr.append(" <cbc:CountrySubentityCode>"+oBillAddr.getStringNull(DB.id_state,"")+"</cbc:CountrySubentityCode>\n");
597       oBfr.append(" <cbc:AddressLine><![CDATA["+oBillAddr.getStringNull(DB.tx_addr1,"")+"]]></cbc:AddressLine>\n");
598       oBfr.append(" <Country><![CDATA["+oBillAddr.getStringNull(DB.nm_country,"").trim()+"]]></Country>\n");
599     }
600     oBfr.append(" </cac:Address>\n");
601     oBfr.append(" </cac:Party>\n");
602     oBfr.append(" <cac:AccountsContact>\n");
603     if (oBillAddr==null) {
604       oBfr.append(" <cbc:Name/>\n");
605       oBfr.append(" <cbc:Telephone/>\n");
606     } else {
607       oBfr.append(" <cbc:Name><![CDATA["+oBuyer.getStringNull(DB.contact_person,"")+"]]></cbc:Name>\n");
608       oBfr.append(" <cbc:Telephone><![CDATA["+oBuyer.getStringNull(DB.direct_phone,oBuyer.getStringNull(DB.work_phone,""))+"]]></cbc:Telephone>\n");
609     }
610     oBfr.append(" </cac:AccountsContact>\n");
611     oBfr.append(" </cac:BuyerParty>\n");
612     if (DebugFile.trace) DebugFile.writeln("Writting SellerParty...");
613     oBfr.append(" <cac:SellerParty>\n");
614     oBfr.append(" <cac:Party>\n");
615     oBfr.append(" <cac:PartyName><cbc:Name><![CDATA["+oSeller.getStringNull(DB.nm_company,oSeller.getStringNull(DB.nm_shop,""))+"]]></cbc:Name></cac:PartyName>\n");
616     oBfr.append(" <cac:Address>\n");
617     if (oBillAddr==null) {
618       oBfr.append(" <ID/>\n");
619       oBfr.append(" <cbc:PostBox/>\n");
620       oBfr.append(" <cbc:StreetName/>\n");
621       oBfr.append(" <cbc:AdditionalStreetName/>\n");
622       oBfr.append(" <cbc:BuildingName/>\n");
623       oBfr.append(" <cbc:BuildingNumber/>\n");
624       oBfr.append(" <cbc:CityName/>\n");
625       oBfr.append(" <cbc:PostalZone/>\n");
626       oBfr.append(" <cbc:CountrySubentity/>\n");
627       oBfr.append(" <cbc:CountrySubentityCode/>\n");
628       oBfr.append(" <cbc:AddressLine/>\n");
629       oBfr.append(" <Country/>\n");
630     } else {
631       oBfr.append(" <ID>"+oSeller.getStringNull(DB.gu_shop, oSeller.getStringNull(DB.gu_address, ""))+"</ID>\n");
632       oBfr.append(" <cbc:StreetName><![CDATA["+oSeller.getStringNull(DB.nm_street,"")+"]]></cbc:StreetName>\n");
633       oBfr.append(" <cbc:AdditionalStreetName><![CDATA["+oSeller.getStringNull(DB.tp_street,"")+"]]></cbc:AdditionalStreetName>\n");
634       oBfr.append(" <cbc:BuildingName><![CDATA["+oSeller.getStringNull(DB.tx_addr2,"")+"]]></cbc:BuildingName>\n");
635       oBfr.append(" <cbc:BuildingNumber><![CDATA["+oSeller.getStringNull(DB.nu_street,"")+"]]></cbc:BuildingNumber>\n");
636       oBfr.append(" <cbc:CityName><![CDATA["+oSeller.getStringNull(DB.mn_city,"")+"]]></cbc:CityName>\n");
637       oBfr.append(" <cbc:PostalZone>"+oSeller.getStringNull(DB.zipcode,"")+"</cbc:PostalZone>\n");
638       oBfr.append(" <cbc:CountrySubentity><![CDATA["+oSeller.getStringNull(DB.nm_state,"")+"]]></cbc:CountrySubentity>\n");
639       oBfr.append(" <cbc:CountrySubentityCode>"+oSeller.getStringNull(DB.id_state,"")+"</cbc:CountrySubentityCode>\n");
640       oBfr.append(" <cbc:AddressLine><![CDATA["+oSeller.getStringNull(DB.tx_addr1,"")+"]]></cbc:AddressLine>\n");
641       oBfr.append(" <Country><![CDATA["+oSeller.getStringNull(DB.nm_country,"").trim()+"]]></Country>\n");
642     }
643     oBfr.append(" </cac:Address>\n");
644     oBfr.append(" </cac:Party>\n");
645     oBfr.append(" <cac:AccountsContact>\n");
646     oBfr.append(" <cbc:Name><![CDATA["+oSeller.getStringNull(DB.contact_person,"")+"]]></cbc:Name>\n");
647     oBfr.append(" <cbc:Telephone><![CDATA["+oSeller.getStringNull(DB.direct_phone,oSeller.getStringNull(DB.work_phone,""))+"]]></cbc:Telephone>\n");
648     oBfr.append(" </cac:AccountsContact>\n");
649     oBfr.append(" </cac:SellerParty>\n");
650     oBfr.append(" <cac:PaymentMeans>\n");
651     oBfr.append(" <cbc:DuePaymentDate>"+(isNull(DB.dt_payment) ? "" : getDateShort(DB.dt_payment))+"</cbc:DuePaymentDate>\n");
652     oBfr.append(" <PayeeFinancialAccount>\n");
653     oBfr.append(" <ID>"+oSeller.getStringNull(DB.nu_bank_acc,"")+"</ID>\n");
654     oBfr.append(" <FinancialInstitutionBranch><![CDATA["+oSeller.getStringNull(DB.nm_bank,"")+"]]></FinancialInstitutionBranch>\n");
655     oBfr.append(" </PayeeFinancialAccount>\n");
656     oBfr.append(" <PayerFinancialAccount>\n");
657     oBfr.append(" <ID>"+oBuyer.getStringNull(DB.nu_bank_acc,"")+"</ID>\n");
658     oBfr.append(" <FinancialInstitutionBranch><![CDATA["+oBuyer.getStringNull(DB.nm_bank,"")+"]]></FinancialInstitutionBranch>\n");
659     oBfr.append(" </PayerFinancialAccount>\n");
660     oBfr.append(" <Payment>\n");
661     oBfr.append(" <ID/>\n");
662     if (isNull(DB.im_paid) && isNull(DB.im_total))
663       oBfr.append(" <PaidAmount>/n");
664     else if (isNull(DB.im_paid))
665       oBfr.append(" <PaidAmount>"+getDecimal(DB.im_total).toString()+"</PaidAmount>\n");
666     else
667       oBfr.append(" <PaidAmount>"+getDecimal(DB.im_paid).toString()+"</PaidAmount>\n");
668     oBfr.append(" <cbc:ReceivedDate>"+(isNull(DB.dt_paid) ? "" : getDateShort(DB.dt_paid))+"</cbc:ReceivedDate>\n");
669     oBfr.append(" </Payment>\n");
670     oBfr.append(" </cac:PaymentMeans>\n");
671     if (DebugFile.trace) DebugFile.writeln("Writting Delivery...");
672     oBfr.append(" <cac:Delivery>\n");
673     if (oShipAddr!=null) {
674       oBfr.append(" <cac:DeliveryAddress>\n");
675       oBfr.append(" <ID>"+oShipAddr.getString(DB.gu_address)+"</ID>\n");
676       oBfr.append(" <cbc:StreetName><![CDATA["+oShipAddr.getStringNull(DB.nm_street,"")+"]]></cbc:StreetName>\n");
677       oBfr.append(" <cbc:AdditionalStreetName><![CDATA["+oShipAddr.getStringNull(DB.tp_street,"")+"]]></cbc:AdditionalStreetName>\n");
678       oBfr.append(" <cbc:BuildingName><![CDATA["+oShipAddr.getStringNull(DB.tx_addr2,"")+"]]></cbc:BuildingName>\n");
679       oBfr.append(" <cbc:BuildingNumber><![CDATA["+oShipAddr.getStringNull(DB.nu_street,"")+"]]></cbc:BuildingNumber>\n");
680       oBfr.append(" <cbc:CityName><![CDATA["+oShipAddr.getStringNull(DB.mn_city,"")+"]]></cbc:CityName>\n");
681       oBfr.append(" <cbc:PostalZone>"+oShipAddr.getStringNull(DB.zipcode,"")+"</cbc:PostalZone>\n");
682       oBfr.append(" <cbc:CountrySubentity><![CDATA["+oShipAddr.getStringNull(DB.nm_state,"")+"]]></cbc:CountrySubentity>\n");
683       oBfr.append(" <cbc:CountrySubentityCode>"+oShipAddr.getStringNull(DB.id_state,"")+"</cbc:CountrySubentityCode>\n");
684       oBfr.append(" <cbc:AddressLine><![CDATA["+oShipAddr.getStringNull(DB.tx_addr1,"")+"]]></cbc:AddressLine>\n");
685       oBfr.append(" <Country><![CDATA["+oShipAddr.getStringNull(DB.id_country,"").trim()+"]]></Country>\n");
686       oBfr.append(" </cac:DeliveryAddress>\n");
687     }
688     oBfr.append(" </cac:Delivery>\n");
689     if (DebugFile.trace) DebugFile.writeln("Writting TaxTotal...");
690     oBfr.append(" <cac:TaxTotal>\n");
691     oBfr.append(" <cbc:TotalTaxAmount amountCurrencyCodeListVersionID=\"0.3\" amountCurrencyID=\""+getString(DB.id_currency)+"\">");
692     oBfr.append(getDecimalFormated(DB.im_taxes));
693     oBfr.append("</cbc:TotalTaxAmount>\n");
694     oBfr.append(" </cac:TaxTotal>\n");
695     if (DebugFile.trace) DebugFile.writeln("Writting LegalTotal...");
696     oBfr.append(" <cac:LegalTotal>\n");
697     oBfr.append(" <cbc:LineExtensionTotalAmount amountCurrencyCodeListVersionID=\"0.3\" amountCurrencyID=\""+getString(DB.id_currency)+"\">");
698     oBfr.append(getDecimalFormated(DB.im_subtotal));
699     oBfr.append("</cbc:LineExtensionTotalAmount>\n");
700     oBfr.append(" <cbc:TaxInclusiveTotalAmount amountCurrencyCodeListVersionID=\"0.3\" amountCurrencyID=\""+getString(DB.id_currency)+"\">");
701     oBfr.append(getDecimalFormated(DB.im_total));
702     oBfr.append("</cbc:TaxInclusiveTotalAmount>\n");
703     oBfr.append(" </cac:LegalTotal>\n");
704     for (int l=0; l<iLineCount; l++) {
705       if (DebugFile.trace) DebugFile.writeln("Writting InvoiceLine "+String.valueOf(l+1)+"...");
706       oBfr.append(" <cac:InvoiceLine>\n");
707       oBfr.append(" <ID>"+String.valueOf(l+1)+"</ID>\n");
708       float fQuantity = oLines.getFloat(DB.nu_quantity,l);
709       if (fQuantity == (long) fQuantity)
710         oBfr.append(" <cbc:InvoicedQuantity>"+String.valueOf((long)fQuantity)+"</cbc:InvoicedQuantity>\n");
711       else
712         oBfr.append(" <cbc:InvoicedQuantity>"+String.valueOf(fQuantity)+"</cbc:InvoicedQuantity>\n");
713       oBfr.append(" <cbc:LineExtensionAmount amountCurrencyCodeListVersionID=\"0.3\" amountCurrencyID=\""+getString(DB.id_currency)+"\">"+oLines.getDecimalFormated(DB.pr_total,l,getCurrencyFormat())+"</cbc:LineExtensionAmount>\n");
714       oBfr.append(" <cac:Item>\n");
715       oBfr.append(" <cbc:Description><![CDATA["+oLines.getString(DB.nm_product,l)+"]]></cbc:Description>\n");
716       oBfr.append(" </cac:Item>\n");
717       if (oLines.isNull(DB.pr_sale,l))
718         oBfr.append(" <BasePrice/>\n");
719       else
720         oBfr.append(" <BasePrice>"+oLines.getDecimalFormated(DB.pr_sale,l,getCurrencyFormat())+"</BasePrice>\n");
721       oBfr.append(" </cac:InvoiceLine>\n");
722     }
723     oBfr.append(" </Invoice>\n");
724
725     if (DebugFile.trace) {
726       DebugFile.decIdent();
727       DebugFile.writeln("End Invoice.toXML()");
728     }
729
730     return oBfr.toString();
731   } // toXML()
732

733   // ---------------------------------------------------------------------------
734

735   /**
736    * <p>Get invoice as an XML document</p>
737    * Character encoding is set to UTF-8
738    * @return An XML String formatted according to OASIS Universal Universal Business Language Specification
739    * @throws IllegalStateException if invoice lines are not loaded or buyer is not set or seller is not set
740    * @see <a HREF="http://docs.oasis-open.org/ubl/cd-UBL-1.0/">OASIS Universal Business Language 1.0</a>
741    */

742
743   public String JavaDoc toXML() throws IllegalStateException JavaDoc {
744     JDCConnection oConn = null;
745     return toXML (oConn, null);
746   }
747
748   // ---------------------------------------------------------------------------
749

750   /**
751    * <p>Get invoice as an XML document</p>
752    * Character encoding is set to UTF-8
753    * @return An XML String formatted according to OASIS Universal Universal Business Language Specification
754    * @throws IllegalStateException if invoice lines are not loaded or buyer is not set or seller is not set
755    * @see <a HREF="http://docs.oasis-open.org/ubl/cd-UBL-1.0/">OASIS Universal Business Language 1.0</a>
756    */

757
758   public String JavaDoc toXML(String JavaDoc sIdent, String JavaDoc sDelim) throws IllegalStateException JavaDoc {
759     JDCConnection oConn = null;
760     return toXML (oConn, null);
761   }
762
763   // ---------------------------------------------------------------------------
764

765   /**
766    * <p>Get invoice as an XML document</p>
767    * Character encoding is set to UTF-8
768    * @return An XML String formatted according to OASIS Universal Universal Business Language Specification
769    * @throws IllegalStateException if invoice lines are not loaded or buyer is not set or seller is not set
770    * @see <a HREF="http://docs.oasis-open.org/ubl/cd-UBL-1.0/">OASIS Universal Business Language 1.0</a>
771    */

772
773   public String JavaDoc toXML(String JavaDoc sIdent) throws IllegalStateException JavaDoc {
774     JDCConnection oConn = null;
775     return toXML (oConn, null);
776   }
777
778   // ---------------------------------------------------------------------------
779

780   /**
781    * Get invoice GUID given its number
782    * @param oConn JDCConnection
783    * @param iInvoicePg int Invoice number (pg_invoice column at k_invoices table)
784    * @param sWorkArea GUID of WorkArea to which invoice belongs
785    * @return String Invoice GUID or <b>null</b> if no invoice with such number was found at given WorkArea
786    * @throws SQLException
787    */

788   public static String JavaDoc getIdFromNumber(JDCConnection oConn, int iInvoicePg, String JavaDoc sWorkArea)
789     throws SQLException JavaDoc {
790     String JavaDoc sInvoiceId;
791     PreparedStatement JavaDoc oStmt = oConn.prepareStatement("SELECT "+DB.gu_invoice+" FROM "+DB.k_invoices+" WHERE "+DB.pg_invoice+"=? AND "+DB.gu_workarea+"=?",
792                                                      ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
793     oStmt.setInt(1, iInvoicePg);
794     oStmt.setString(2, sWorkArea);
795     ResultSet JavaDoc oRSet = oStmt.executeQuery();
796     if (oRSet.next())
797       sInvoiceId = oRSet.getString(1);
798     else
799       sInvoiceId = null;
800     oRSet.close();
801     oStmt.close();
802     return sInvoiceId;
803   }
804
805   // ---------------------------------------------------------------------------
806

807   /**
808    * Get next value for field pg_invoice in a given WorkArea
809    * @param oConn JDCConnection JDBC Connection
810    * @param sGuWorkArea String WorkArea GUID
811    * @return int Next unused invoice number
812    * @throws SQLException
813    */

814   public static int nextVal(JDCConnection oConn, String JavaDoc sGuWorkArea)
815     throws SQLException JavaDoc {
816     boolean bNext;
817     int iNextInvoic = 1;
818     String JavaDoc sSQL = "";
819     PreparedStatement JavaDoc oSnxt = null;
820     ResultSet JavaDoc oRnxt = null;
821
822     sSQL = "SELECT "+DB.pg_invoice+","+DB.gu_workarea+" FROM "+DB.k_invoices_next+ " WHERE "+DB.gu_workarea+"=? ";
823     if (oConn.getDataBaseProduct()==JDCConnection.DBMS_POSTGRESQL) {
824       sSQL += "FOR UPDATE OF "+DB.k_invoices_next;
825     } if (oConn.getDataBaseProduct()==JDCConnection.DBMS_ORACLE) {
826       sSQL += "FOR UPDATE OF "+DB.pg_invoice;
827     }
828
829     try {
830       if (DebugFile.trace) DebugFile.writeln("Connection.prepareStatement("+sSQL+",ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE)");
831       oSnxt = oConn.prepareStatement(sSQL,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
832       oSnxt.setObject(1, sGuWorkArea, Types.CHAR);
833       oRnxt = oSnxt.executeQuery();
834       bNext = oRnxt.next();
835       if (bNext) {
836         iNextInvoic = oRnxt.getInt(1);
837         oRnxt.updateInt(DB.pg_invoice, ++iNextInvoic);
838         oRnxt.updateRow();
839       }
840       oRnxt.close();
841       oRnxt=null;
842       oSnxt.close();
843       oSnxt=null;
844       if (!bNext) {
845         if (DebugFile.trace) DebugFile.writeln("Connection.prepareStatement("+sSQL+",ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE)");
846         sSQL = "INSERT INTO "+DB.k_invoices_next+" ("+DB.gu_workarea+","+DB.pg_invoice+") VALUES (?,?)";
847         oSnxt = oConn.prepareStatement(sSQL);
848         oSnxt.setObject(1, sGuWorkArea, Types.CHAR);
849         oSnxt.setInt(2, iNextInvoic);
850         oSnxt.executeUpdate();
851         oSnxt.close();
852       }
853     } catch (SQLException JavaDoc sqle) {
854       if (oRnxt!=null) oRnxt.close();
855       if (oSnxt!=null) oSnxt.close();
856       throw new SQLException JavaDoc (sqle.getMessage()+" "+sSQL,sqle.getSQLState(),sqle.getErrorCode());
857     }
858     return iNextInvoic;
859   } // nextVal
860

861   // **********************************************************
862
// Constantes Publicas
863

864   public static final short ClassId = 47;
865
866   // ---------------------------------------------------------------------------
867
}
868
Popular Tags