Subversion Repositories SmartDukaan

Rev

Rev 24215 | Rev 24509 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
21686 ashik.ali 1
package com.spice.profitmandi.common.util;
2
 
24506 amit.gupta 3
import java.io.ByteArrayInputStream;
4
import java.io.ByteArrayOutputStream;
5
import java.io.IOException;
21686 ashik.ali 6
import java.io.OutputStream;
24506 amit.gupta 7
import java.net.URL;
23001 amit.gupta 8
import java.util.List;
21915 ashik.ali 9
import java.util.Locale;
21686 ashik.ali 10
import java.util.Set;
11
 
24506 amit.gupta 12
import org.apache.logging.log4j.LogManager;
23568 govind 13
import org.apache.logging.log4j.Logger;
22068 ashik.ali 14
import org.springframework.util.StringUtils;
21686 ashik.ali 15
 
21915 ashik.ali 16
import com.ibm.icu.text.RuleBasedNumberFormat;
21686 ashik.ali 17
import com.itextpdf.text.Chunk;
18
import com.itextpdf.text.Document;
19
import com.itextpdf.text.DocumentException;
20
import com.itextpdf.text.Element;
21
import com.itextpdf.text.Font;
24506 amit.gupta 22
import com.itextpdf.text.Font.FontFamily;
23
import com.itextpdf.text.Image;
21686 ashik.ali 24
import com.itextpdf.text.Paragraph;
24506 amit.gupta 25
import com.itextpdf.text.Phrase;
21686 ashik.ali 26
import com.itextpdf.text.Rectangle;
24506 amit.gupta 27
import com.itextpdf.text.pdf.ColumnText;
28
import com.itextpdf.text.pdf.PdfContentByte;
29
import com.itextpdf.text.pdf.PdfDocument;
30
import com.itextpdf.text.pdf.PdfGState;
21686 ashik.ali 31
import com.itextpdf.text.pdf.PdfPCell;
32
import com.itextpdf.text.pdf.PdfPTable;
24506 amit.gupta 33
import com.itextpdf.text.pdf.PdfReader;
34
import com.itextpdf.text.pdf.PdfStamper;
21686 ashik.ali 35
import com.itextpdf.text.pdf.PdfWriter;
23654 amit.gupta 36
import com.spice.profitmandi.common.model.CreditNotePdfModel;
21686 ashik.ali 37
import com.spice.profitmandi.common.model.CustomCustomer;
23001 amit.gupta 38
import com.spice.profitmandi.common.model.CustomInsurancePolicy;
22858 ashik.ali 39
import com.spice.profitmandi.common.model.CustomOrderItem;
23558 amit.gupta 40
import com.spice.profitmandi.common.model.CustomPaymentOption;
21686 ashik.ali 41
import com.spice.profitmandi.common.model.CustomRetailer;
23509 amit.gupta 42
import com.spice.profitmandi.common.model.DebitNotePdfModel;
21686 ashik.ali 43
import com.spice.profitmandi.common.model.PdfModel;
44
 
45
public class PdfUtils {
23509 amit.gupta 46
 
47
	private static final Font FONT_TITLE = new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD);
21965 ashik.ali 48
	private static Font FONT_NORMAL = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL);
49
	private static Font FONT_BOLD = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD);
23509 amit.gupta 50
	// private static Font fontTableHeader = new
51
	// Font(Font.FontFamily.TIMES_ROMAN, 14, Font.BOLD);
24215 amit.gupta 52
	public static final String INVOICE_TITLE = "TAX INVOICE";
53
	public static final String DEBIT_NOTE_TITLE = "DEBIT NOTE";
54
	public static final String SECURITY_DEPOSIT = "SECURITY DEPOSIT RECEIPT";
23509 amit.gupta 55
 
23654 amit.gupta 56
	private static float[] igstWidthsWithDiscount = new float[] { .3f, 2.6f, 0.7f, .4f, 0.7f, 0.5f, .7f, .6f, 0.6f,
57
			0.9f };
23549 amit.gupta 58
	private static float[] stateWidthsWithDiscount = new float[] { .3f, 2.1f, 0.7f, .3f, 0.6f, 0.4f, .7f, .5f, .6f, .5f,
23509 amit.gupta 59
			.6f, .8f };
60
 
23542 amit.gupta 61
	private static float[] igstWidths = new float[] { .6f, 2.6f, 0.7f, .4f, 0.7f, .7f, .6f, 0.6f, 0.9f };
62
	private static float[] stateWidths = new float[] { .6f, 2.1f, 0.7f, .3f, 0.6f, .7f, .5f, .6f, .5f, .6f, .8f };
23533 amit.gupta 63
 
23654 amit.gupta 64
	private static float[] igstWidthsCrNote = new float[] { 2.6f, 0.7f, .4f, 0.7f, .7f, .6f, 0.6f, 0.9f };
65
	private static float[] stateWidthsCrNote = new float[] { 2.1f, 0.7f, .3f, 0.6f, .7f, .5f, .6f, .5f, .6f, .8f };
66
 
21915 ashik.ali 67
	private static final Locale indianLocale = Locale.getDefault();
23509 amit.gupta 68
 
23568 govind 69
	private static final Logger LOGGER = LogManager.getLogger(PdfUtils.class);
24506 amit.gupta 70
 
71
	private static URL cancelledImgUrl = null;
72
	static {
73
		cancelledImgUrl = PdfUtils.class.getResource("cancelled.png");
74
	}
23509 amit.gupta 75
 
76
	public static void generateAndWrite(PdfModel pdfModel, OutputStream outputStream) {
21686 ashik.ali 77
		Document document = new Document();
21926 ashik.ali 78
		document.setMargins(0, 0, 25, 0);
23509 amit.gupta 79
		try {
80
			CustomCustomer customer = pdfModel.getCustomer();
81
			CustomRetailer retailer = pdfModel.getRetailer();
82
			boolean stateGst = false;
83
			String customerAddressStateCode = "", retailerAddressStateCode = "";
84
			if (customer.getAddress().getState().equals(retailer.getAddress().getState())) {
85
				stateGst = true;
86
				customerAddressStateCode = Utils.getStateCode(customer.getAddress().getState());
87
			} else {
88
				customerAddressStateCode = Utils.getStateCode(customer.getAddress().getState());
89
				retailerAddressStateCode = Utils.getStateCode(retailer.getAddress().getState());
90
			}
91
			Set<CustomOrderItem> orderItems = pdfModel.getOrderItems();
24506 amit.gupta 92
			ByteArrayOutputStream oos = null;
93
			if(pdfModel.isCancelled()) {
94
				oos = new ByteArrayOutputStream();
95
				PdfWriter.getInstance(document, oos);
96
			} else {
97
				PdfWriter.getInstance(document, outputStream);
98
			}
21686 ashik.ali 99
 
23509 amit.gupta 100
			document.open();
101
			document.addTitle(pdfModel.getTitle());
102
			document.addAuthor(pdfModel.getAuther());
22889 amit.gupta 103
 
23509 amit.gupta 104
			Paragraph paragraphTitle = new Paragraph(INVOICE_TITLE, FONT_TITLE);
105
			paragraphTitle.setAlignment(Element.ALIGN_CENTER);
21686 ashik.ali 106
 
23509 amit.gupta 107
			PdfPCell blankCell = new PdfPCell();
108
			blankCell.setBorder(Rectangle.NO_BORDER);
109
			PdfPTable tableCustomerRetailer = new PdfPTable(3);
110
			tableCustomerRetailer.setWidthPercentage(90);
111
			tableCustomerRetailer.getDefaultCell().setBorder(Rectangle.NO_BORDER);
112
			PdfPCell columnCustomerInfo = new PdfPCell();
113
			columnCustomerInfo.addElement(new Paragraph("Customer Details", FONT_BOLD));
114
			columnCustomerInfo.addElement(new Paragraph(
115
					StringUtils.capitalize(customer.getFirstName() + " " + customer.getLastName()), FONT_NORMAL));
116
			columnCustomerInfo.addElement(new Paragraph(StringUtils.capitalize(customer.getAddress().getLine1()) + ", "
117
					+ StringUtils.capitalize(customer.getAddress().getLine2()), FONT_NORMAL));
118
			columnCustomerInfo.addElement(new Paragraph(StringUtils.capitalize(customer.getAddress().getCity()) + ", "
119
					+ StringUtils.capitalize(customer.getAddress().getState()) + "(" + customerAddressStateCode + ")"
120
					+ "\n" + customer.getAddress().getPinCode(), FONT_NORMAL));
121
			columnCustomerInfo.addElement(new Paragraph("Mobile - " + customer.getMobileNumber(), FONT_NORMAL));
122
			if (customer.getGstNumber() != null && !customer.getGstNumber().isEmpty()) {
123
				columnCustomerInfo.addElement(new Paragraph("GST Number - " + customer.getGstNumber(), FONT_NORMAL));
124
			}
125
			columnCustomerInfo.setBorder(Rectangle.NO_BORDER);
126
			PdfPCell columnRetailerInfo = new PdfPCell();
127
			columnRetailerInfo
128
					.addElement(new Paragraph(StringUtils.capitalize(retailer.getAddress().getName()), FONT_BOLD));
129
			columnRetailerInfo.addElement(new Paragraph(StringUtils.capitalize(retailer.getAddress().getLine1()) + ", "
130
					+ StringUtils.capitalize(retailer.getAddress().getLine2()) + ", "
131
					+ StringUtils.capitalize(retailer.getAddress().getCity()) + "-" + retailer.getAddress().getPinCode()
132
					+ ", " + retailer.getAddress().getState() + "("
133
					+ (stateGst ? customerAddressStateCode : retailerAddressStateCode) + ")", FONT_BOLD));
134
			columnRetailerInfo
135
					.addElement(new Paragraph("Contact No.- " + retailer.getAddress().getPhoneNumber(), FONT_BOLD));
136
			columnRetailerInfo.addElement(new Paragraph("GST NO. " + retailer.getGstNumber(), FONT_BOLD));
137
			columnRetailerInfo.setBorder(Rectangle.NO_BORDER);
138
 
139
			PdfPTable tableInvoiceDateRetailer = new PdfPTable(1);
140
			tableInvoiceDateRetailer.getDefaultCell().setBorder(Rectangle.NO_BORDER);
141
 
142
			PdfPTable tableInvoiceDate = new PdfPTable(2);
143
			tableInvoiceDate.getDefaultCell().setBorder(Rectangle.NO_BORDER);
144
 
145
			PdfPCell invoiceNumberKey = new PdfPCell(new Paragraph("Invoice No:", FONT_NORMAL));
146
			invoiceNumberKey.setBorder(Rectangle.NO_BORDER);
147
 
148
			PdfPCell invoiceNumberValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceNumber(), FONT_NORMAL));
149
			invoiceNumberValue.setBorder(Rectangle.NO_BORDER);
150
 
151
			PdfPCell dateKey = new PdfPCell(new Paragraph("Date:", FONT_NORMAL));
152
			dateKey.setBorder(Rectangle.NO_BORDER);
153
 
154
			PdfPCell dateValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceDate(), FONT_NORMAL));
155
			dateValue.setBorder(Rectangle.NO_BORDER);
156
			tableInvoiceDate.addCell(invoiceNumberKey);
157
			// tableInvoiceDate.addCell(blankCell);
158
			tableInvoiceDate.addCell(invoiceNumberValue);
159
			tableInvoiceDate.addCell(dateKey);
160
			// tableInvoiceDate.addCell(blankCell);
161
			tableInvoiceDate.addCell(dateValue);
162
			tableInvoiceDateRetailer.addCell(tableInvoiceDate);
163
			tableInvoiceDateRetailer.addCell(columnRetailerInfo);
164
 
165
			tableCustomerRetailer.addCell(columnCustomerInfo);
166
			tableCustomerRetailer.addCell(blankCell);
167
			tableCustomerRetailer.addCell(tableInvoiceDateRetailer);
168
 
169
			PdfPTable orders = null;
170
			if (stateGst) {
171
				orders = new PdfPTable(stateWidthsWithDiscount.length);
172
				orders.setWidths(stateWidthsWithDiscount);
173
			} else {
174
				orders = new PdfPTable(igstWidthsWithDiscount.length);
175
				orders.setWidths(igstWidthsWithDiscount);
176
			}
177
			orders.setWidthPercentage(90);
178
			orders.addCell(new Paragraph("Sl", FONT_BOLD));
179
			orders.addCell(new Paragraph("Description", FONT_BOLD));
180
			orders.addCell(new Paragraph("HSN", FONT_BOLD));
181
			orders.addCell(new Paragraph("Qty", FONT_BOLD));
182
			orders.addCell(new Paragraph("Rate\n(Per pc)", FONT_BOLD));
183
			orders.addCell(new Paragraph("Disc.", FONT_BOLD));
184
			orders.addCell(new Paragraph("Total\nTaxable", FONT_BOLD));
185
			if (!stateGst) {
186
				orders.addCell(new Paragraph("IGST\n%", FONT_BOLD));
187
				orders.addCell(new Paragraph("IGST", FONT_BOLD));
188
				// orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1});
189
				// total 8f
190
			} else {
191
				orders.addCell(new Paragraph("CGST %", FONT_BOLD));
192
				orders.addCell(new Paragraph("CGST", FONT_BOLD));
193
				orders.addCell(new Paragraph("SGST %", FONT_BOLD));
194
				orders.addCell(new Paragraph("SGST", FONT_BOLD));
195
				// orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1, 1, 1});
196
				// total 8f
197
			}
198
			orders.addCell(new Paragraph("Total", FONT_BOLD));
199
 
200
			// orders.addCell(new Paragraph("Item Total (Rs)", FONT_BOLD));
201
 
202
			orders.setHeaderRows(1);
203
			// orders.setSkipFirstHeader(true);
204
 
205
			float igstTotalAmount = 0, cgstTotalAmount = 0, sgstTotalAmount = 0;
206
			int index = 1;
207
			for (CustomOrderItem orderItem : orderItems) {
208
				orders.addCell(new Paragraph(String.valueOf(index++), FONT_NORMAL));
209
				orders.addCell(new Paragraph(orderItem.getDescription(), FONT_NORMAL));
210
				orders.addCell(new Paragraph(orderItem.getHsnCode(), FONT_NORMAL));
211
				orders.addCell(new Paragraph(String.valueOf(orderItem.getQuantity()), FONT_NORMAL));
212
				orders.addCell(new Paragraph(String.format("%.2f", orderItem.getRate()), FONT_NORMAL));
213
				orders.addCell(new Paragraph(String.format("%.2f", orderItem.getDiscount()), FONT_NORMAL));
214
				orders.addCell(new Paragraph(String.format("%.2f", orderItem.getAmount()), FONT_NORMAL));
215
				if (!stateGst) {
216
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstRate()), FONT_NORMAL));
217
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstAmount()), FONT_NORMAL));
218
					igstTotalAmount = igstTotalAmount + orderItem.getIgstAmount();
219
				} else {
220
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstRate()), FONT_NORMAL));
221
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstAmount()), FONT_NORMAL));
222
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstRate()), FONT_NORMAL));
223
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstAmount()), FONT_NORMAL));
224
					cgstTotalAmount = cgstTotalAmount + orderItem.getCgstAmount();
225
					sgstTotalAmount = sgstTotalAmount + orderItem.getSgstAmount();
226
				}
227
				orders.addCell(new Paragraph(String.format("%.0f", orderItem.getNetAmount()), FONT_NORMAL));
228
				// orders.addCell(new Paragraph(String.format("%.2f",
229
				// orderItem.getItemTotal()), FONT_NORMAL));
230
			}
231
 
232
			for (CustomInsurancePolicy insurancePolicy : pdfModel.getInsurancePolicies()) {
233
				orders.addCell(new Paragraph(String.valueOf(index++), FONT_NORMAL));
234
				orders.addCell(new Paragraph(insurancePolicy.getDescription(), FONT_NORMAL));
235
				orders.addCell(new Paragraph(insurancePolicy.getHsnCode(), FONT_NORMAL));
236
				orders.addCell(new Paragraph("1", FONT_NORMAL));
237
				orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getRate()), FONT_NORMAL));
238
				orders.addCell(new Paragraph("-", FONT_NORMAL));
239
				orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getRate()), FONT_NORMAL));
240
				if (!stateGst) {
241
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getIgstRate()), FONT_NORMAL));
242
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getIgstAmount()), FONT_NORMAL));
243
					igstTotalAmount = igstTotalAmount + insurancePolicy.getIgstAmount();
244
				} else {
245
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getCgstRate()), FONT_NORMAL));
246
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getCgstAmount()), FONT_NORMAL));
247
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getSgstRate()), FONT_NORMAL));
248
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getSgstAmount()), FONT_NORMAL));
249
					cgstTotalAmount = cgstTotalAmount + insurancePolicy.getCgstAmount();
250
					sgstTotalAmount = sgstTotalAmount + insurancePolicy.getSgstAmount();
251
				}
252
				orders.addCell(new Paragraph(String.format("%.0f", insurancePolicy.getNetAmount()), FONT_NORMAL));
253
			}
254
 
255
			document.add(paragraphTitle);
256
			document.add(Chunk.NEWLINE);
257
			document.add(Chunk.NEWLINE);
258
			document.add(tableCustomerRetailer);
259
 
260
			document.add(Chunk.NEWLINE);
261
			document.add(orders);
262
 
263
			PdfPTable grandTotalTable = new PdfPTable(3);
23552 amit.gupta 264
			PdfPTable paymentsTable = new PdfPTable(2);
265
			paymentsTable.setWidthPercentage(95);
266
			paymentsTable.setWidths(new float[] { 8f, 2f });
23654 amit.gupta 267
 
23509 amit.gupta 268
			if (stateGst) {
269
				grandTotalTable.setWidths(new float[] { 6.6f, .6f, .8f });
270
			} else {
271
				grandTotalTable.setWidths(new float[] { 6.5f, .6f, .9f });
272
			}
273
			grandTotalTable.setWidthPercentage(90);
274
 
275
			Paragraph grandTotalParagraph = new Paragraph("Grand total", FONT_BOLD);
276
			grandTotalParagraph.setIndentationRight(20);
277
			grandTotalTable.addCell(grandTotalParagraph);
278
			Paragraph rsParagraph = new Paragraph("Rs.", FONT_BOLD);
279
			grandTotalTable.addCell(rsParagraph);
280
			Paragraph amountParagraph = new Paragraph(String.format("%.2f", pdfModel.getTotalAmount()), FONT_BOLD);
281
			grandTotalTable.addCell(amountParagraph);
282
 
283
			document.add(grandTotalTable);
284
 
285
			PdfPTable amountInWordsTable = new PdfPTable(3);
23558 amit.gupta 286
			amountInWordsTable.setWidthPercentage(90);
287
			amountInWordsTable.addCell(new Paragraph("Amount in Words:", FONT_BOLD));
23509 amit.gupta 288
			if (!stateGst) {
289
				amountInWordsTable.setWidths(new float[] { 2, 5.1f, 0.9f });
290
			} else {
291
				amountInWordsTable.setWidths(new float[] { 2, 5.2f, 0.8f });
292
			}
293
 
294
			String amountInWords = toAmountInWords(pdfModel.getTotalAmount());
295
			amountInWordsTable.addCell(new Paragraph(amountInWords.toString(), FONT_BOLD));
296
			amountInWordsTable.addCell(new Paragraph("E & O.E", FONT_NORMAL));
297
			document.add(amountInWordsTable);
23654 amit.gupta 298
 
299
			if (pdfModel.getPaymentOptions() != null) {
23566 amit.gupta 300
				PdfPTable paidAmountTable = new PdfPTable(2);
23558 amit.gupta 301
				paidAmountTable.setWidthPercentage(90);
302
				if (!stateGst) {
23566 amit.gupta 303
					paidAmountTable.setWidths(new float[] { 7.1f, 0.9f });
23558 amit.gupta 304
				} else {
23566 amit.gupta 305
					paidAmountTable.setWidths(new float[] { 7.2f, 0.8f });
23558 amit.gupta 306
				}
23566 amit.gupta 307
				float totalPaidValue = 0;
23654 amit.gupta 308
				for (CustomPaymentOption paymentOption : pdfModel.getPaymentOptions()) {
309
					PdfPCell cell = new PdfPCell(
310
							new Paragraph(10, "Paid Through " + paymentOption.getPaymentOption(), FONT_BOLD));
23558 amit.gupta 311
					cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
312
					cell.setPadding(5);
313
					paidAmountTable.addCell(cell);
23509 amit.gupta 314
 
23654 amit.gupta 315
					PdfPCell cell1 = new PdfPCell(new Paragraph(10,
316
							FormattingUtils.formatDecimalTwoDigits(paymentOption.getAmount()), FONT_BOLD));
23558 amit.gupta 317
					cell1.setPadding(5);
318
					paidAmountTable.addCell(cell1);
23566 amit.gupta 319
					totalPaidValue += paymentOption.getAmount();
23654 amit.gupta 320
 
23558 amit.gupta 321
				}
23566 amit.gupta 322
				PdfPCell totalPaidCell = new PdfPCell(new Paragraph(10, "Total Paid", FONT_BOLD));
323
				totalPaidCell.setHorizontalAlignment(Element.ALIGN_RIGHT);
324
				totalPaidCell.setPadding(5);
325
				paidAmountTable.addCell(totalPaidCell);
23654 amit.gupta 326
 
327
				PdfPCell totalPaidValueCell = new PdfPCell(
328
						new Paragraph(10, FormattingUtils.formatDecimalTwoDigits(totalPaidValue), FONT_BOLD));
23566 amit.gupta 329
				totalPaidValueCell.setPadding(5);
330
				paidAmountTable.addCell(totalPaidValueCell);
23654 amit.gupta 331
 
23558 amit.gupta 332
				document.add(paidAmountTable);
333
			}
334
 
23509 amit.gupta 335
			StringBuffer sb = new StringBuffer();
336
			List<String> tncs = pdfModel.getTncs();
337
			for (String tnc : tncs) {
338
				sb.append(tnc).append("\n");
339
			}
340
 
341
			Paragraph warningParagraph = new Paragraph(sb.toString(), FONT_NORMAL);
342
			warningParagraph.setIndentationLeft(40);
343
			document.add(Chunk.NEWLINE);
344
			document.add(warningParagraph);
345
			document.close(); // no need to close PDFwriter?
24506 amit.gupta 346
			if(pdfModel.isCancelled()) {
347
				stampCancelled(oos, outputStream);
348
			}
23509 amit.gupta 349
 
350
		} catch (DocumentException e) {
351
			LOGGER.error("Unable to write data to pdf file : ", e);
352
		} catch (Exception e) {
21901 ashik.ali 353
			// TODO Auto-generated catch block
354
			e.printStackTrace();
355
		}
24506 amit.gupta 356
 
21686 ashik.ali 357
	}
23509 amit.gupta 358
 
24506 amit.gupta 359
	private static void stampCancelled(ByteArrayOutputStream byteStream, OutputStream os) throws IOException, DocumentException {
360
		ByteArrayInputStream bais = new ByteArrayInputStream(byteStream.toByteArray());
361
	    PdfReader pdfReader = new PdfReader(bais);
362
	    int n = pdfReader.getNumberOfPages();
363
	    PdfStamper pdfStamper = new PdfStamper(pdfReader, os);
364
	    pdfStamper.setRotateContents(false);
365
	    // text watermark
366
        Font f = new Font(FontFamily.HELVETICA, 30);
367
        Phrase p = new Phrase("My watermark (text)", f);
368
        //img watermark
369
	    Image img = Image.getInstance(cancelledImgUrl);
370
        float w = img.getScaledWidth();
371
        float h = img.getScaledHeight();
372
        // transparency
373
        PdfGState gs1 = new PdfGState();
374
        gs1.setFillOpacity(0.5f);
375
        //properties
376
        PdfContentByte over;
377
        Rectangle pagesize;
378
        float x, y;
379
 
380
	    // loop over every page
381
	    for (int i = 1; i <= n; i++) {
382
	    	pagesize = pdfReader.getPageSize(i);
383
            x = (pagesize.getLeft() + pagesize.getRight()) / 2;
384
            y = (pagesize.getTop() + pagesize.getBottom()) / 2;
385
            over = pdfStamper.getOverContent(i);
386
            over.saveState();
387
            over.setGState(gs1);
388
            if (i % 2 == 1)
389
                ColumnText.showTextAligned(over, Element.ALIGN_CENTER, p, x, y, 0);
390
            else
391
                over.addImage(img, w, 0, 0, h, x - (w / 2), y - (h / 2));
392
            over.restoreState();
393
        }
394
	    pdfStamper.close();
395
        pdfReader.close();
396
 
397
	}
398
 
23509 amit.gupta 399
	public static void generateAndWriteDebitNote(List<DebitNotePdfModel> debitNotePdfModels,
400
			OutputStream outputStream) {
401
		Document document = new Document();
402
		document.setMargins(0, 0, 25, 0);
403
		try {
404
			for (DebitNotePdfModel debitNotePdfModel : debitNotePdfModels) {
405
 
406
				PdfModel pdfModel = debitNotePdfModel.getPdfModel();
407
				CustomCustomer customer = pdfModel.getCustomer();
408
				CustomRetailer retailer = pdfModel.getRetailer();
409
				boolean stateGst = false;
410
				String customerAddressStateCode = "", retailerAddressStateCode = "";
411
				if (customer.getAddress().getState().equals(retailer.getAddress().getState())) {
412
					stateGst = true;
413
					customerAddressStateCode = Utils.getStateCode(customer.getAddress().getState());
23549 amit.gupta 414
					retailerAddressStateCode = customerAddressStateCode;
23509 amit.gupta 415
				} else {
416
					customerAddressStateCode = Utils.getStateCode(customer.getAddress().getState());
417
					retailerAddressStateCode = Utils.getStateCode(retailer.getAddress().getState());
418
				}
419
				Set<CustomOrderItem> orderItems = pdfModel.getOrderItems();
420
 
421
				PdfWriter.getInstance(document, outputStream);
422
 
423
				document.open();
424
				document.addTitle(pdfModel.getTitle());
425
				document.addAuthor(pdfModel.getAuther());
426
 
23654 amit.gupta 427
				Paragraph paragraphTitle = new Paragraph(pdfModel.getTitle(), FONT_TITLE);
23509 amit.gupta 428
				paragraphTitle.setAlignment(Element.ALIGN_CENTER);
429
 
430
				PdfPCell blankCell = new PdfPCell();
431
				blankCell.setBorder(Rectangle.NO_BORDER);
432
				PdfPTable tableCustomerRetailer = new PdfPTable(3);
23533 amit.gupta 433
				tableCustomerRetailer.setWidthPercentage(95);
23532 amit.gupta 434
				PdfPCell partnerInfo = new PdfPCell();
23549 amit.gupta 435
				partnerInfo.addElement(new Paragraph("From Party:", FONT_BOLD));
23654 amit.gupta 436
				partnerInfo.addElement(
437
						new Paragraph(StringUtils.capitalize(customer.getAddress().getName()), FONT_NORMAL));
438
				partnerInfo.addElement(new Paragraph(
439
						StringUtils.capitalize(customer.getAddress().getLine1()) + ", "
440
								+ (customer.getAddress().getLine2() == null ? ""
441
										: StringUtils.capitalize(customer.getAddress().getLine2()))
442
								+ ", " + customer.getAddress().getCity() + " - " + customer.getAddress().getPinCode(),
443
						FONT_NORMAL));
444
 
445
				partnerInfo.addElement(new Paragraph(
446
						StringUtils.capitalize(customer.getAddress().getState()) + "(" + customerAddressStateCode + ")",
447
						FONT_NORMAL));
23532 amit.gupta 448
				partnerInfo.addElement(new Paragraph("Mobile - " + customer.getMobileNumber(), FONT_NORMAL));
23509 amit.gupta 449
				if (customer.getGstNumber() != null && !customer.getGstNumber().isEmpty()) {
23549 amit.gupta 450
					partnerInfo.addElement(new Paragraph("GST No - " + customer.getGstNumber(), FONT_BOLD));
23509 amit.gupta 451
				}
23533 amit.gupta 452
 
23532 amit.gupta 453
				PdfPCell sellerParty = new PdfPCell();
23549 amit.gupta 454
				sellerParty.addElement(new Paragraph("To Party:", FONT_BOLD));
23654 amit.gupta 455
				sellerParty.addElement(
456
						new Paragraph(StringUtils.capitalize(retailer.getAddress().getName()), FONT_NORMAL));
457
				sellerParty.addElement(new Paragraph((retailer.getAddress().getLine1() == null ? ""
458
						: StringUtils.capitalize(retailer.getAddress().getLine1()) + ", ")
459
						+ (retailer.getAddress().getLine2() == null ? ""
460
								: StringUtils.capitalize(retailer.getAddress().getLine2()) + ", ")
461
						+ StringUtils.capitalize(retailer.getAddress().getCity()) + "-"
462
						+ retailer.getAddress().getPinCode() + ", ", FONT_NORMAL));
23532 amit.gupta 463
				sellerParty.addElement(new Paragraph(
23654 amit.gupta 464
						retailer.getAddress().getState() + "(" + retailerAddressStateCode + ")", FONT_NORMAL));
465
				sellerParty
466
						.addElement(new Paragraph("Mobile - " + retailer.getAddress().getPhoneNumber(), FONT_NORMAL));
23549 amit.gupta 467
				sellerParty.addElement(new Paragraph("GST No - " + retailer.getGstNumber(), FONT_BOLD));
23509 amit.gupta 468
 
469
				PdfPTable tableInvoiceDateRetailer = new PdfPTable(1);
470
				tableInvoiceDateRetailer.getDefaultCell().setBorder(Rectangle.NO_BORDER);
471
 
472
				PdfPTable tableInvoiceDate = new PdfPTable(2);
473
				tableInvoiceDate.getDefaultCell().setBorder(Rectangle.NO_BORDER);
23533 amit.gupta 474
				tableInvoiceDate.setWidthPercentage(90);
23509 amit.gupta 475
 
23533 amit.gupta 476
				PdfPCell debitNoteDetails = new PdfPCell(new Paragraph("Debit Note Details", FONT_BOLD));
477
				debitNoteDetails.setColspan(2);
478
				debitNoteDetails.setBorder(Rectangle.NO_BORDER);
23654 amit.gupta 479
 
23532 amit.gupta 480
				PdfPCell debitNoteNumberKey = new PdfPCell(new Paragraph("Debit Note No:", FONT_NORMAL));
481
				debitNoteNumberKey.setBorder(Rectangle.NO_BORDER);
23654 amit.gupta 482
				PdfPCell debitNoteNumberValue = new PdfPCell(
483
						new Paragraph(debitNotePdfModel.getDebitNoteNumber(), FONT_NORMAL));
23532 amit.gupta 484
				debitNoteNumberValue.setBorder(Rectangle.NO_BORDER);
485
 
486
				PdfPCell debitNoteDateKey = new PdfPCell(new Paragraph("Debit Note Dt:", FONT_NORMAL));
487
				debitNoteDateKey.setBorder(Rectangle.NO_BORDER);
23533 amit.gupta 488
 
489
				PdfPCell debitNoteDateValue = new PdfPCell(
490
						new Paragraph(debitNotePdfModel.getDebitNoteDate(), FONT_NORMAL));
23532 amit.gupta 491
				debitNoteDateValue.setBorder(Rectangle.NO_BORDER);
492
 
23539 amit.gupta 493
				PdfPCell invoiceNumberKey = new PdfPCell(new Paragraph("Invoice Ref No:", FONT_NORMAL));
23509 amit.gupta 494
				invoiceNumberKey.setBorder(Rectangle.NO_BORDER);
495
				PdfPCell invoiceNumberValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceNumber(), FONT_NORMAL));
496
				invoiceNumberValue.setBorder(Rectangle.NO_BORDER);
497
 
23532 amit.gupta 498
				PdfPCell dateKey = new PdfPCell(new Paragraph("Invoice Dt:", FONT_NORMAL));
23509 amit.gupta 499
				dateKey.setBorder(Rectangle.NO_BORDER);
23549 amit.gupta 500
				PdfPCell dateValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceDate(), FONT_NORMAL));
23509 amit.gupta 501
				dateValue.setBorder(Rectangle.NO_BORDER);
23533 amit.gupta 502
 
503
				tableInvoiceDate.addCell(debitNoteDetails);
23532 amit.gupta 504
				tableInvoiceDate.addCell(debitNoteNumberKey);
505
				tableInvoiceDate.addCell(debitNoteNumberValue);
506
				tableInvoiceDate.addCell(debitNoteDateKey);
507
				tableInvoiceDate.addCell(debitNoteDateValue);
23509 amit.gupta 508
				tableInvoiceDate.addCell(invoiceNumberKey);
509
				tableInvoiceDate.addCell(invoiceNumberValue);
510
				tableInvoiceDate.addCell(dateKey);
511
				tableInvoiceDate.addCell(dateValue);
512
 
23532 amit.gupta 513
				tableCustomerRetailer.addCell(partnerInfo);
23533 amit.gupta 514
				tableCustomerRetailer.addCell(tableInvoiceDate);
515
				tableCustomerRetailer.addCell(sellerParty);
23509 amit.gupta 516
 
517
				PdfPTable orders = null;
518
				if (stateGst) {
23532 amit.gupta 519
					orders = new PdfPTable(stateWidths.length);
520
					orders.setWidths(stateWidths);
23509 amit.gupta 521
				} else {
23532 amit.gupta 522
					orders = new PdfPTable(igstWidths.length);
523
					orders.setWidths(igstWidths);
23509 amit.gupta 524
				}
23549 amit.gupta 525
				orders.setWidthPercentage(95);
23542 amit.gupta 526
				orders.addCell(new Paragraph("Order Id", FONT_BOLD));
23509 amit.gupta 527
				orders.addCell(new Paragraph("Description", FONT_BOLD));
528
				orders.addCell(new Paragraph("HSN", FONT_BOLD));
529
				orders.addCell(new Paragraph("Qty", FONT_BOLD));
530
				orders.addCell(new Paragraph("Rate\n(Per pc)", FONT_BOLD));
531
				orders.addCell(new Paragraph("Total\nTaxable", FONT_BOLD));
532
				if (!stateGst) {
533
					orders.addCell(new Paragraph("IGST\n%", FONT_BOLD));
534
					orders.addCell(new Paragraph("IGST", FONT_BOLD));
535
					// orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1});
536
					// total 8f
537
				} else {
538
					orders.addCell(new Paragraph("CGST %", FONT_BOLD));
539
					orders.addCell(new Paragraph("CGST", FONT_BOLD));
540
					orders.addCell(new Paragraph("SGST %", FONT_BOLD));
541
					orders.addCell(new Paragraph("SGST", FONT_BOLD));
542
					// orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1, 1,
543
					// 1});
544
					// total 8f
545
				}
546
				orders.addCell(new Paragraph("Total", FONT_BOLD));
547
 
548
				orders.setHeaderRows(1);
549
 
550
				float igstTotalAmount = 0, cgstTotalAmount = 0, sgstTotalAmount = 0;
551
				for (CustomOrderItem orderItem : orderItems) {
23542 amit.gupta 552
					orders.addCell(new Paragraph(String.valueOf(orderItem.getOrderId()), FONT_NORMAL));
23509 amit.gupta 553
					orders.addCell(new Paragraph(orderItem.getDescription(), FONT_NORMAL));
554
					orders.addCell(new Paragraph(orderItem.getHsnCode(), FONT_NORMAL));
555
					orders.addCell(new Paragraph(String.valueOf(orderItem.getQuantity()), FONT_NORMAL));
556
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getRate()), FONT_NORMAL));
557
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getAmount()), FONT_NORMAL));
558
					if (!stateGst) {
559
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstRate()), FONT_NORMAL));
560
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstAmount()), FONT_NORMAL));
561
						igstTotalAmount = igstTotalAmount + orderItem.getIgstAmount();
562
					} else {
563
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstRate()), FONT_NORMAL));
564
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstAmount()), FONT_NORMAL));
565
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstRate()), FONT_NORMAL));
566
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstAmount()), FONT_NORMAL));
567
						cgstTotalAmount = cgstTotalAmount + orderItem.getCgstAmount();
568
						sgstTotalAmount = sgstTotalAmount + orderItem.getSgstAmount();
569
					}
570
					orders.addCell(new Paragraph(String.format("%.0f", orderItem.getNetAmount()), FONT_NORMAL));
23533 amit.gupta 571
					LOGGER.info("IN FOR LOOP");
23509 amit.gupta 572
				}
573
 
574
				document.add(paragraphTitle);
23533 amit.gupta 575
 
23509 amit.gupta 576
				document.add(Chunk.NEWLINE);
577
				document.add(tableCustomerRetailer);
578
 
579
				document.add(Chunk.NEWLINE);
580
				document.add(orders);
581
 
582
				PdfPTable grandTotalTable = new PdfPTable(3);
583
				if (stateGst) {
584
					grandTotalTable.setWidths(new float[] { 6.6f, .6f, .8f });
585
				} else {
586
					grandTotalTable.setWidths(new float[] { 6.5f, .6f, .9f });
587
				}
23549 amit.gupta 588
				grandTotalTable.setWidthPercentage(95);
23509 amit.gupta 589
 
590
				Paragraph grandTotalParagraph = new Paragraph("Grand total", FONT_BOLD);
591
				grandTotalParagraph.setIndentationRight(20);
592
				grandTotalTable.addCell(grandTotalParagraph);
593
				Paragraph rsParagraph = new Paragraph("Rs.", FONT_BOLD);
594
				grandTotalTable.addCell(rsParagraph);
595
				Paragraph amountParagraph = new Paragraph(String.format("%.2f", pdfModel.getTotalAmount()), FONT_BOLD);
596
				grandTotalTable.addCell(amountParagraph);
597
 
598
				document.add(grandTotalTable);
599
 
600
				PdfPTable amountInWordsTable = new PdfPTable(3);
601
				if (!stateGst) {
602
					amountInWordsTable.setWidths(new float[] { 2, 5.1f, 0.9f });
603
				} else {
604
					amountInWordsTable.setWidths(new float[] { 2, 5.2f, 0.8f });
605
				}
23549 amit.gupta 606
				amountInWordsTable.setWidthPercentage(95);
23509 amit.gupta 607
				amountInWordsTable.addCell(new Paragraph("Amount in Words:", FONT_BOLD));
608
 
609
				String amountInWords = toAmountInWords(pdfModel.getTotalAmount());
610
				amountInWordsTable.addCell(new Paragraph(amountInWords.toString(), FONT_BOLD));
611
				amountInWordsTable.addCell(new Paragraph("E & O.E", FONT_NORMAL));
612
				document.add(amountInWordsTable);
613
 
614
				document.newPage();
615
			}
616
			document.close(); // no need to close PDFwriter?
617
		} catch (DocumentException e) {
618
			LOGGER.error("Unable to write data to pdf file : ", e);
619
		} catch (Exception e) {
620
			// TODO Auto-generated catch block
621
			e.printStackTrace();
622
		}
21915 ashik.ali 623
	}
23509 amit.gupta 624
 
625
	private static String toAmountInWords(float amount) {
626
		RuleBasedNumberFormat amountInWordsFormat = new RuleBasedNumberFormat(indianLocale,
627
				RuleBasedNumberFormat.SPELLOUT);
628
		StringBuilder amountInWords = new StringBuilder("Rs. ");
629
		amountInWords.append(StringUtils.capitalize(amountInWordsFormat.format((int) amount)));
630
		amountInWords.append(" and ");
631
		amountInWords.append(StringUtils.capitalize(amountInWordsFormat.format((int) (amount * 100) % 100)));
632
		amountInWords.append(" paise");
633
		return amountInWords.toString();
634
	}
23654 amit.gupta 635
 
24506 amit.gupta 636
	public static void generateAndWriteCustomerCreditNotes(List<CreditNotePdfModel> creditNotes,
637
			OutputStream outputStream) {
23654 amit.gupta 638
		Document document = new Document();
639
		document.setMargins(0, 0, 25, 0);
640
		try {
641
			PdfWriter.getInstance(document, outputStream);
24506 amit.gupta 642
 
23654 amit.gupta 643
			document.open();
644
			document.addTitle(creditNotes.get(0).getPdfModel().getTitle());
645
			document.addAuthor(creditNotes.get(0).getPdfModel().getAuther());
646
			for (CreditNotePdfModel creditNotePdfModel : creditNotes) {
647
				PdfModel pdfModel = creditNotePdfModel.getPdfModel();
648
				CustomCustomer customer = pdfModel.getCustomer();
649
				CustomRetailer retailer = pdfModel.getRetailer();
650
				boolean stateGst = false;
651
				String customerAddressStateCode = "", retailerAddressStateCode = "";
652
				if (customer.getAddress().getState().equals(retailer.getAddress().getState())) {
653
					stateGst = true;
654
					customerAddressStateCode = Utils.getStateCode(customer.getAddress().getState());
655
					retailerAddressStateCode = customerAddressStateCode;
656
				} else {
657
					customerAddressStateCode = Utils.getStateCode(customer.getAddress().getState());
658
					retailerAddressStateCode = Utils.getStateCode(retailer.getAddress().getState());
659
				}
660
				Set<CustomOrderItem> orderItems = pdfModel.getOrderItems();
661
 
662
				Paragraph paragraphTitle = new Paragraph(pdfModel.getTitle(), FONT_TITLE);
663
				paragraphTitle.setAlignment(Element.ALIGN_CENTER);
664
 
665
				PdfPCell blankCell = new PdfPCell();
666
				blankCell.setBorder(Rectangle.NO_BORDER);
667
				PdfPTable tableCustomerRetailer = new PdfPTable(3);
668
				tableCustomerRetailer.setWidthPercentage(95);
669
				PdfPCell partnerInfo = new PdfPCell();
670
				partnerInfo.addElement(new Paragraph("To Party:", FONT_BOLD));
671
				partnerInfo.addElement(
672
						new Paragraph(StringUtils.capitalize(customer.getAddress().getName()), FONT_NORMAL));
673
				partnerInfo.addElement(new Paragraph(
674
						StringUtils.capitalize(customer.getAddress().getLine1()) + ", "
675
								+ (customer.getAddress().getLine2() == null ? ""
676
										: StringUtils.capitalize(customer.getAddress().getLine2()))
677
								+ ", " + customer.getAddress().getCity() + " - " + customer.getAddress().getPinCode(),
678
						FONT_NORMAL));
679
 
680
				partnerInfo.addElement(new Paragraph(
681
						StringUtils.capitalize(customer.getAddress().getState()) + "(" + customerAddressStateCode + ")",
682
						FONT_NORMAL));
683
				partnerInfo.addElement(new Paragraph("Mobile - " + customer.getMobileNumber(), FONT_NORMAL));
684
				if (customer.getGstNumber() != null && !customer.getGstNumber().isEmpty()) {
685
					partnerInfo.addElement(new Paragraph("GST No - " + customer.getGstNumber(), FONT_BOLD));
686
				}
687
 
688
				PdfPCell sellerParty = new PdfPCell();
689
				sellerParty.addElement(new Paragraph("From Party:", FONT_BOLD));
690
				sellerParty.addElement(
691
						new Paragraph(StringUtils.capitalize(retailer.getAddress().getName()), FONT_NORMAL));
692
				sellerParty.addElement(new Paragraph((retailer.getAddress().getLine1() == null ? ""
693
						: StringUtils.capitalize(retailer.getAddress().getLine1()) + ", ")
694
						+ (retailer.getAddress().getLine2() == null ? ""
695
								: StringUtils.capitalize(retailer.getAddress().getLine2()) + ", ")
696
						+ StringUtils.capitalize(retailer.getAddress().getCity()) + "-"
697
						+ retailer.getAddress().getPinCode() + ", ", FONT_NORMAL));
698
				sellerParty.addElement(new Paragraph(
699
						retailer.getAddress().getState() + "(" + retailerAddressStateCode + ")", FONT_NORMAL));
700
				sellerParty
701
						.addElement(new Paragraph("Mobile - " + retailer.getAddress().getPhoneNumber(), FONT_NORMAL));
702
				sellerParty.addElement(new Paragraph("GST No - " + retailer.getGstNumber(), FONT_BOLD));
703
 
704
				PdfPTable tableInvoiceDateRetailer = new PdfPTable(1);
705
				tableInvoiceDateRetailer.getDefaultCell().setBorder(Rectangle.NO_BORDER);
706
 
707
				PdfPTable tableInvoiceDate = new PdfPTable(2);
708
				tableInvoiceDate.getDefaultCell().setBorder(Rectangle.NO_BORDER);
709
				tableInvoiceDate.setWidthPercentage(90);
710
 
711
				PdfPCell debitNoteDetails = new PdfPCell(new Paragraph("Credit Note Details", FONT_BOLD));
712
				debitNoteDetails.setColspan(2);
713
				debitNoteDetails.setBorder(Rectangle.NO_BORDER);
714
 
715
				PdfPCell debitNoteNumberKey = new PdfPCell(new Paragraph("Credit Note No:", FONT_NORMAL));
716
				debitNoteNumberKey.setBorder(Rectangle.NO_BORDER);
717
				PdfPCell debitNoteNumberValue = new PdfPCell(
718
						new Paragraph(creditNotePdfModel.getCreditNoteNumber(), FONT_NORMAL));
719
				debitNoteNumberValue.setBorder(Rectangle.NO_BORDER);
720
 
721
				PdfPCell debitNoteDateKey = new PdfPCell(new Paragraph("Credit Note Dt:", FONT_NORMAL));
722
				debitNoteDateKey.setBorder(Rectangle.NO_BORDER);
723
 
724
				PdfPCell debitNoteDateValue = new PdfPCell(
725
						new Paragraph(creditNotePdfModel.getCreditNoteDate(), FONT_NORMAL));
726
				debitNoteDateValue.setBorder(Rectangle.NO_BORDER);
727
 
728
				PdfPCell invoiceNumberKey = new PdfPCell(new Paragraph("Invoice Ref No:", FONT_NORMAL));
729
				invoiceNumberKey.setBorder(Rectangle.NO_BORDER);
730
				PdfPCell invoiceNumberValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceNumber(), FONT_NORMAL));
731
				invoiceNumberValue.setBorder(Rectangle.NO_BORDER);
732
 
733
				PdfPCell dateKey = new PdfPCell(new Paragraph("Invoice Dt:", FONT_NORMAL));
734
				dateKey.setBorder(Rectangle.NO_BORDER);
735
				PdfPCell dateValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceDate(), FONT_NORMAL));
736
				dateValue.setBorder(Rectangle.NO_BORDER);
737
 
738
				tableInvoiceDate.addCell(debitNoteDetails);
739
				tableInvoiceDate.addCell(debitNoteNumberKey);
740
				tableInvoiceDate.addCell(debitNoteNumberValue);
741
				tableInvoiceDate.addCell(debitNoteDateKey);
742
				tableInvoiceDate.addCell(debitNoteDateValue);
743
				tableInvoiceDate.addCell(invoiceNumberKey);
744
				tableInvoiceDate.addCell(invoiceNumberValue);
745
				tableInvoiceDate.addCell(dateKey);
746
				tableInvoiceDate.addCell(dateValue);
747
 
748
				tableCustomerRetailer.addCell(partnerInfo);
749
				tableCustomerRetailer.addCell(tableInvoiceDate);
750
				tableCustomerRetailer.addCell(sellerParty);
751
 
752
				PdfPTable orders = null;
753
				if (stateGst) {
754
					orders = new PdfPTable(stateWidthsCrNote.length);
755
					orders.setWidths(stateWidthsCrNote);
756
				} else {
757
					orders = new PdfPTable(igstWidthsCrNote.length);
758
					orders.setWidths(igstWidthsCrNote);
759
				}
760
				orders.setWidthPercentage(95);
761
				orders.addCell(new Paragraph("Description", FONT_BOLD));
762
				orders.addCell(new Paragraph("HSN", FONT_BOLD));
763
				orders.addCell(new Paragraph("Qty", FONT_BOLD));
764
				orders.addCell(new Paragraph("Rate\n(Per pc)", FONT_BOLD));
765
				orders.addCell(new Paragraph("Total\nTaxable", FONT_BOLD));
766
				if (!stateGst) {
767
					orders.addCell(new Paragraph("IGST%", FONT_BOLD));
768
					orders.addCell(new Paragraph("IGST", FONT_BOLD));
769
					// orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1});
770
					// total 8f
771
				} else {
772
					orders.addCell(new Paragraph("CGST %", FONT_BOLD));
773
					orders.addCell(new Paragraph("CGST", FONT_BOLD));
774
					orders.addCell(new Paragraph("SGST %", FONT_BOLD));
775
					orders.addCell(new Paragraph("SGST", FONT_BOLD));
776
					// orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1, 1,
777
					// 1});
778
					// total 8f
779
				}
780
				orders.addCell(new Paragraph("Total", FONT_BOLD));
781
 
782
				orders.setHeaderRows(1);
783
 
784
				float igstTotalAmount = 0, cgstTotalAmount = 0, sgstTotalAmount = 0;
785
				for (CustomOrderItem orderItem : orderItems) {
786
					LOGGER.info("Custom Order Item - {}", orderItem);
787
					orders.addCell(new Paragraph(orderItem.getDescription(), FONT_NORMAL));
788
					orders.addCell(new Paragraph(orderItem.getHsnCode(), FONT_NORMAL));
789
					orders.addCell(new Paragraph(String.valueOf(orderItem.getQuantity()), FONT_NORMAL));
790
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getRate()), FONT_NORMAL));
791
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getAmount()), FONT_NORMAL));
792
					if (!stateGst) {
793
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstRate()), FONT_NORMAL));
794
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstAmount()), FONT_NORMAL));
795
						igstTotalAmount = igstTotalAmount + orderItem.getIgstAmount();
796
					} else {
797
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstRate()), FONT_NORMAL));
798
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstAmount()), FONT_NORMAL));
799
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstRate()), FONT_NORMAL));
800
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstAmount()), FONT_NORMAL));
801
						cgstTotalAmount = cgstTotalAmount + orderItem.getCgstAmount();
802
						sgstTotalAmount = sgstTotalAmount + orderItem.getSgstAmount();
803
					}
804
					orders.addCell(new Paragraph(String.format("%.0f", orderItem.getNetAmount()), FONT_NORMAL));
805
					LOGGER.info("IN FOR LOOP");
806
				}
807
 
808
				document.add(paragraphTitle);
809
 
810
				document.add(Chunk.NEWLINE);
811
				document.add(tableCustomerRetailer);
812
 
813
				document.add(Chunk.NEWLINE);
814
				document.add(orders);
815
 
816
				PdfPTable grandTotalTable = new PdfPTable(3);
817
				if (stateGst) {
818
					grandTotalTable.setWidths(new float[] { 6.6f, .6f, .8f });
819
				} else {
820
					grandTotalTable.setWidths(new float[] { 6.5f, .6f, .9f });
821
				}
822
				grandTotalTable.setWidthPercentage(95);
823
 
824
				Paragraph grandTotalParagraph = new Paragraph("Grand total", FONT_BOLD);
825
				grandTotalParagraph.setIndentationRight(20);
826
				grandTotalTable.addCell(grandTotalParagraph);
827
				Paragraph rsParagraph = new Paragraph("Rs.", FONT_BOLD);
828
				grandTotalTable.addCell(rsParagraph);
829
				Paragraph amountParagraph = new Paragraph(String.format("%.2f", pdfModel.getTotalAmount()), FONT_BOLD);
830
				grandTotalTable.addCell(amountParagraph);
831
 
832
				document.add(grandTotalTable);
833
 
834
				PdfPTable amountInWordsTable = new PdfPTable(3);
835
				if (!stateGst) {
836
					amountInWordsTable.setWidths(new float[] { 2, 5.1f, 0.9f });
837
				} else {
838
					amountInWordsTable.setWidths(new float[] { 2, 5.2f, 0.8f });
839
				}
840
				amountInWordsTable.setWidthPercentage(95);
841
				amountInWordsTable.addCell(new Paragraph("Amount in Words:", FONT_BOLD));
842
 
843
				String amountInWords = toAmountInWords(pdfModel.getTotalAmount());
844
				amountInWordsTable.addCell(new Paragraph(amountInWords.toString(), FONT_BOLD));
845
				amountInWordsTable.addCell(new Paragraph("E & O.E", FONT_NORMAL));
846
				document.add(amountInWordsTable);
847
 
848
				document.newPage();
849
			}
850
			document.close(); // no need to close PDFwriter?
851
		} catch (DocumentException e) {
852
			LOGGER.error("Unable to write data to pdf file : ", e);
853
		} catch (Exception e) {
854
			// TODO Auto-generated catch block
855
			e.printStackTrace();
856
		}
857
 
858
	}
21686 ashik.ali 859
}