Subversion Repositories SmartDukaan

Rev

Rev 23509 | Rev 23533 | 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
 
3
import java.io.OutputStream;
23001 amit.gupta 4
import java.util.List;
21915 ashik.ali 5
import java.util.Locale;
21686 ashik.ali 6
import java.util.Set;
7
 
8
import org.slf4j.Logger;
9
import org.slf4j.LoggerFactory;
22068 ashik.ali 10
import org.springframework.util.StringUtils;
21686 ashik.ali 11
 
21915 ashik.ali 12
import com.ibm.icu.text.RuleBasedNumberFormat;
21686 ashik.ali 13
import com.itextpdf.text.Chunk;
14
import com.itextpdf.text.Document;
15
import com.itextpdf.text.DocumentException;
16
import com.itextpdf.text.Element;
17
import com.itextpdf.text.Font;
18
import com.itextpdf.text.Paragraph;
19
import com.itextpdf.text.Rectangle;
20
import com.itextpdf.text.pdf.PdfPCell;
21
import com.itextpdf.text.pdf.PdfPTable;
22
import com.itextpdf.text.pdf.PdfWriter;
23
import com.spice.profitmandi.common.model.CustomCustomer;
23001 amit.gupta 24
import com.spice.profitmandi.common.model.CustomInsurancePolicy;
22858 ashik.ali 25
import com.spice.profitmandi.common.model.CustomOrderItem;
21686 ashik.ali 26
import com.spice.profitmandi.common.model.CustomRetailer;
23509 amit.gupta 27
import com.spice.profitmandi.common.model.DebitNotePdfModel;
21686 ashik.ali 28
import com.spice.profitmandi.common.model.PdfModel;
29
 
30
public class PdfUtils {
23509 amit.gupta 31
 
32
	private static final Font FONT_TITLE = new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD);
21965 ashik.ali 33
	private static Font FONT_NORMAL = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL);
34
	private static Font FONT_BOLD = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD);
23509 amit.gupta 35
	// private static Font fontTableHeader = new
36
	// Font(Font.FontFamily.TIMES_ROMAN, 14, Font.BOLD);
23374 amit.gupta 37
	private static final String INVOICE_TITLE = "TAX INVOICE";
23532 amit.gupta 38
	private static final String DEBIT_NOTE_TITLE = "DEBIT NOTE";
23509 amit.gupta 39
 
40
	private static float[] igstWidthsWithDiscount = new float[] { .3f, 2.6f, 0.7f, .4f, 0.7f, 0.5f, .7f, .6f, 0.6f,
41
			0.9f };
42
	private static float[] stateWidthsWithDiscount = new float[] { .2f, 2.1f, 0.7f, .3f, 0.6f, 0.4f, .7f, .5f, .6f, .5f,
43
			.6f, .8f };
23532 amit.gupta 44
 
45
	private static float[] igstWidths = new float[] { .3f, 2.6f, 0.7f, .4f, 0.7f, 0.5f, .7f, .6f, 0.6f,
46
			0.9f };
47
	private static float[] stateWidths = new float[] { .2f, 2.1f, 0.7f, .3f, 0.6f, 0.4f, .7f, .5f, .6f, .5f,
48
			.6f, .8f };
23509 amit.gupta 49
 
21915 ashik.ali 50
	private static final Locale indianLocale = Locale.getDefault();
23509 amit.gupta 51
 
21686 ashik.ali 52
	private static final Logger LOGGER = LoggerFactory.getLogger(PdfUtils.class);
23509 amit.gupta 53
 
54
	public static void generateAndWrite(PdfModel pdfModel, OutputStream outputStream) {
21686 ashik.ali 55
		Document document = new Document();
21926 ashik.ali 56
		document.setMargins(0, 0, 25, 0);
23509 amit.gupta 57
		try {
58
			CustomCustomer customer = pdfModel.getCustomer();
59
			CustomRetailer retailer = pdfModel.getRetailer();
60
			boolean stateGst = false;
61
			String customerAddressStateCode = "", retailerAddressStateCode = "";
62
			if (customer.getAddress().getState().equals(retailer.getAddress().getState())) {
63
				stateGst = true;
64
				customerAddressStateCode = Utils.getStateCode(customer.getAddress().getState());
65
			} else {
66
				customerAddressStateCode = Utils.getStateCode(customer.getAddress().getState());
67
				retailerAddressStateCode = Utils.getStateCode(retailer.getAddress().getState());
68
			}
69
			Set<CustomOrderItem> orderItems = pdfModel.getOrderItems();
21686 ashik.ali 70
 
23509 amit.gupta 71
			PdfWriter.getInstance(document, outputStream);
22687 amit.gupta 72
 
23509 amit.gupta 73
			document.open();
74
			document.addTitle(pdfModel.getTitle());
75
			document.addAuthor(pdfModel.getAuther());
22889 amit.gupta 76
 
23509 amit.gupta 77
			Paragraph paragraphTitle = new Paragraph(INVOICE_TITLE, FONT_TITLE);
78
			paragraphTitle.setAlignment(Element.ALIGN_CENTER);
21686 ashik.ali 79
 
23509 amit.gupta 80
			PdfPCell blankCell = new PdfPCell();
81
			blankCell.setBorder(Rectangle.NO_BORDER);
82
			PdfPTable tableCustomerRetailer = new PdfPTable(3);
83
			tableCustomerRetailer.setWidthPercentage(90);
84
			tableCustomerRetailer.getDefaultCell().setBorder(Rectangle.NO_BORDER);
85
			PdfPCell columnCustomerInfo = new PdfPCell();
86
			columnCustomerInfo.addElement(new Paragraph("Customer Details", FONT_BOLD));
87
			columnCustomerInfo.addElement(new Paragraph(
88
					StringUtils.capitalize(customer.getFirstName() + " " + customer.getLastName()), FONT_NORMAL));
89
			columnCustomerInfo.addElement(new Paragraph(StringUtils.capitalize(customer.getAddress().getLine1()) + ", "
90
					+ StringUtils.capitalize(customer.getAddress().getLine2()), FONT_NORMAL));
91
			columnCustomerInfo.addElement(new Paragraph(StringUtils.capitalize(customer.getAddress().getCity()) + ", "
92
					+ StringUtils.capitalize(customer.getAddress().getState()) + "(" + customerAddressStateCode + ")"
93
					+ "\n" + customer.getAddress().getPinCode(), FONT_NORMAL));
94
			columnCustomerInfo.addElement(new Paragraph("Mobile - " + customer.getMobileNumber(), FONT_NORMAL));
95
			if (customer.getGstNumber() != null && !customer.getGstNumber().isEmpty()) {
96
				columnCustomerInfo.addElement(new Paragraph("GST Number - " + customer.getGstNumber(), FONT_NORMAL));
97
			}
98
			columnCustomerInfo.setBorder(Rectangle.NO_BORDER);
99
			PdfPCell columnRetailerInfo = new PdfPCell();
100
			columnRetailerInfo
101
					.addElement(new Paragraph(StringUtils.capitalize(retailer.getAddress().getName()), FONT_BOLD));
102
			columnRetailerInfo.addElement(new Paragraph(StringUtils.capitalize(retailer.getAddress().getLine1()) + ", "
103
					+ StringUtils.capitalize(retailer.getAddress().getLine2()) + ", "
104
					+ StringUtils.capitalize(retailer.getAddress().getCity()) + "-" + retailer.getAddress().getPinCode()
105
					+ ", " + retailer.getAddress().getState() + "("
106
					+ (stateGst ? customerAddressStateCode : retailerAddressStateCode) + ")", FONT_BOLD));
107
			columnRetailerInfo
108
					.addElement(new Paragraph("Contact No.- " + retailer.getAddress().getPhoneNumber(), FONT_BOLD));
109
			columnRetailerInfo.addElement(new Paragraph("GST NO. " + retailer.getGstNumber(), FONT_BOLD));
110
			columnRetailerInfo.setBorder(Rectangle.NO_BORDER);
111
 
112
			PdfPTable tableInvoiceDateRetailer = new PdfPTable(1);
113
			tableInvoiceDateRetailer.getDefaultCell().setBorder(Rectangle.NO_BORDER);
114
 
115
			PdfPTable tableInvoiceDate = new PdfPTable(2);
116
			tableInvoiceDate.getDefaultCell().setBorder(Rectangle.NO_BORDER);
117
 
118
			PdfPCell invoiceNumberKey = new PdfPCell(new Paragraph("Invoice No:", FONT_NORMAL));
119
			invoiceNumberKey.setBorder(Rectangle.NO_BORDER);
120
 
121
			PdfPCell invoiceNumberValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceNumber(), FONT_NORMAL));
122
			invoiceNumberValue.setBorder(Rectangle.NO_BORDER);
123
 
124
			PdfPCell dateKey = new PdfPCell(new Paragraph("Date:", FONT_NORMAL));
125
			dateKey.setBorder(Rectangle.NO_BORDER);
126
 
127
			PdfPCell dateValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceDate(), FONT_NORMAL));
128
			dateValue.setBorder(Rectangle.NO_BORDER);
129
			tableInvoiceDate.addCell(invoiceNumberKey);
130
			// tableInvoiceDate.addCell(blankCell);
131
			tableInvoiceDate.addCell(invoiceNumberValue);
132
			tableInvoiceDate.addCell(dateKey);
133
			// tableInvoiceDate.addCell(blankCell);
134
			tableInvoiceDate.addCell(dateValue);
135
			tableInvoiceDateRetailer.addCell(tableInvoiceDate);
136
			tableInvoiceDateRetailer.addCell(columnRetailerInfo);
137
 
138
			tableCustomerRetailer.addCell(columnCustomerInfo);
139
			tableCustomerRetailer.addCell(blankCell);
140
			tableCustomerRetailer.addCell(tableInvoiceDateRetailer);
141
 
142
			PdfPTable orders = null;
143
			if (stateGst) {
144
				orders = new PdfPTable(stateWidthsWithDiscount.length);
145
				orders.setWidths(stateWidthsWithDiscount);
146
			} else {
147
				orders = new PdfPTable(igstWidthsWithDiscount.length);
148
				orders.setWidths(igstWidthsWithDiscount);
149
			}
150
			orders.setWidthPercentage(90);
151
			orders.addCell(new Paragraph("Sl", FONT_BOLD));
152
			orders.addCell(new Paragraph("Description", FONT_BOLD));
153
			orders.addCell(new Paragraph("HSN", FONT_BOLD));
154
			orders.addCell(new Paragraph("Qty", FONT_BOLD));
155
			orders.addCell(new Paragraph("Rate\n(Per pc)", FONT_BOLD));
156
			orders.addCell(new Paragraph("Disc.", FONT_BOLD));
157
			orders.addCell(new Paragraph("Total\nTaxable", FONT_BOLD));
158
			if (!stateGst) {
159
				orders.addCell(new Paragraph("IGST\n%", FONT_BOLD));
160
				orders.addCell(new Paragraph("IGST", FONT_BOLD));
161
				// orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1});
162
				// total 8f
163
			} else {
164
				orders.addCell(new Paragraph("CGST %", FONT_BOLD));
165
				orders.addCell(new Paragraph("CGST", FONT_BOLD));
166
				orders.addCell(new Paragraph("SGST %", FONT_BOLD));
167
				orders.addCell(new Paragraph("SGST", FONT_BOLD));
168
				// orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1, 1, 1});
169
				// total 8f
170
			}
171
			orders.addCell(new Paragraph("Total", FONT_BOLD));
172
 
173
			// orders.addCell(new Paragraph("Item Total (Rs)", FONT_BOLD));
174
 
175
			orders.setHeaderRows(1);
176
			// orders.setSkipFirstHeader(true);
177
 
178
			float igstTotalAmount = 0, cgstTotalAmount = 0, sgstTotalAmount = 0;
179
			int index = 1;
180
			for (CustomOrderItem orderItem : orderItems) {
181
				orders.addCell(new Paragraph(String.valueOf(index++), FONT_NORMAL));
182
				orders.addCell(new Paragraph(orderItem.getDescription(), FONT_NORMAL));
183
				orders.addCell(new Paragraph(orderItem.getHsnCode(), FONT_NORMAL));
184
				orders.addCell(new Paragraph(String.valueOf(orderItem.getQuantity()), FONT_NORMAL));
185
				orders.addCell(new Paragraph(String.format("%.2f", orderItem.getRate()), FONT_NORMAL));
186
				orders.addCell(new Paragraph(String.format("%.2f", orderItem.getDiscount()), FONT_NORMAL));
187
				orders.addCell(new Paragraph(String.format("%.2f", orderItem.getAmount()), FONT_NORMAL));
188
				if (!stateGst) {
189
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstRate()), FONT_NORMAL));
190
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstAmount()), FONT_NORMAL));
191
					igstTotalAmount = igstTotalAmount + orderItem.getIgstAmount();
192
				} else {
193
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstRate()), FONT_NORMAL));
194
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstAmount()), FONT_NORMAL));
195
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstRate()), FONT_NORMAL));
196
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstAmount()), FONT_NORMAL));
197
					cgstTotalAmount = cgstTotalAmount + orderItem.getCgstAmount();
198
					sgstTotalAmount = sgstTotalAmount + orderItem.getSgstAmount();
199
				}
200
				orders.addCell(new Paragraph(String.format("%.0f", orderItem.getNetAmount()), FONT_NORMAL));
201
				// orders.addCell(new Paragraph(String.format("%.2f",
202
				// orderItem.getItemTotal()), FONT_NORMAL));
203
			}
204
 
205
			for (CustomInsurancePolicy insurancePolicy : pdfModel.getInsurancePolicies()) {
206
				orders.addCell(new Paragraph(String.valueOf(index++), FONT_NORMAL));
207
				orders.addCell(new Paragraph(insurancePolicy.getDescription(), FONT_NORMAL));
208
				orders.addCell(new Paragraph(insurancePolicy.getHsnCode(), FONT_NORMAL));
209
				orders.addCell(new Paragraph("1", FONT_NORMAL));
210
				orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getRate()), FONT_NORMAL));
211
				orders.addCell(new Paragraph("-", FONT_NORMAL));
212
				orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getRate()), FONT_NORMAL));
213
				if (!stateGst) {
214
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getIgstRate()), FONT_NORMAL));
215
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getIgstAmount()), FONT_NORMAL));
216
					igstTotalAmount = igstTotalAmount + insurancePolicy.getIgstAmount();
217
				} else {
218
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getCgstRate()), FONT_NORMAL));
219
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getCgstAmount()), FONT_NORMAL));
220
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getSgstRate()), FONT_NORMAL));
221
					orders.addCell(new Paragraph(String.format("%.2f", insurancePolicy.getSgstAmount()), FONT_NORMAL));
222
					cgstTotalAmount = cgstTotalAmount + insurancePolicy.getCgstAmount();
223
					sgstTotalAmount = sgstTotalAmount + insurancePolicy.getSgstAmount();
224
				}
225
				orders.addCell(new Paragraph(String.format("%.0f", insurancePolicy.getNetAmount()), FONT_NORMAL));
226
			}
227
 
228
			document.add(paragraphTitle);
229
			document.add(Chunk.NEWLINE);
230
			document.add(Chunk.NEWLINE);
231
			document.add(tableCustomerRetailer);
232
 
233
			document.add(Chunk.NEWLINE);
234
			document.add(orders);
235
 
236
			PdfPTable grandTotalTable = new PdfPTable(3);
237
			if (stateGst) {
238
				grandTotalTable.setWidths(new float[] { 6.6f, .6f, .8f });
239
			} else {
240
				grandTotalTable.setWidths(new float[] { 6.5f, .6f, .9f });
241
			}
242
			grandTotalTable.setWidthPercentage(90);
243
 
244
			Paragraph grandTotalParagraph = new Paragraph("Grand total", FONT_BOLD);
245
			grandTotalParagraph.setIndentationRight(20);
246
			grandTotalTable.addCell(grandTotalParagraph);
247
			Paragraph rsParagraph = new Paragraph("Rs.", FONT_BOLD);
248
			grandTotalTable.addCell(rsParagraph);
249
			Paragraph amountParagraph = new Paragraph(String.format("%.2f", pdfModel.getTotalAmount()), FONT_BOLD);
250
			grandTotalTable.addCell(amountParagraph);
251
 
252
			document.add(grandTotalTable);
253
 
254
			PdfPTable amountInWordsTable = new PdfPTable(3);
255
			if (!stateGst) {
256
				amountInWordsTable.setWidths(new float[] { 2, 5.1f, 0.9f });
257
			} else {
258
				amountInWordsTable.setWidths(new float[] { 2, 5.2f, 0.8f });
259
			}
260
			amountInWordsTable.setWidthPercentage(90);
261
			amountInWordsTable.addCell(new Paragraph("Amount in Words:", FONT_BOLD));
262
 
263
			String amountInWords = toAmountInWords(pdfModel.getTotalAmount());
264
			amountInWordsTable.addCell(new Paragraph(amountInWords.toString(), FONT_BOLD));
265
			amountInWordsTable.addCell(new Paragraph("E & O.E", FONT_NORMAL));
266
			document.add(amountInWordsTable);
267
 
268
			StringBuffer sb = new StringBuffer();
269
			List<String> tncs = pdfModel.getTncs();
270
			for (String tnc : tncs) {
271
				sb.append(tnc).append("\n");
272
			}
273
 
274
			Paragraph warningParagraph = new Paragraph(sb.toString(), FONT_NORMAL);
275
			warningParagraph.setIndentationLeft(40);
276
			document.add(Chunk.NEWLINE);
277
			document.add(warningParagraph);
278
 
279
			document.close(); // no need to close PDFwriter?
280
 
281
		} catch (DocumentException e) {
282
			LOGGER.error("Unable to write data to pdf file : ", e);
283
		} catch (Exception e) {
21901 ashik.ali 284
			// TODO Auto-generated catch block
285
			e.printStackTrace();
286
		}
21686 ashik.ali 287
	}
23509 amit.gupta 288
 
289
	public static void generateAndWriteDebitNote(List<DebitNotePdfModel> debitNotePdfModels,
290
			OutputStream outputStream) {
291
		Document document = new Document();
292
		document.setMargins(0, 0, 25, 0);
293
		try {
294
			for (DebitNotePdfModel debitNotePdfModel : debitNotePdfModels) {
295
 
296
				PdfModel pdfModel = debitNotePdfModel.getPdfModel();
297
				CustomCustomer customer = pdfModel.getCustomer();
298
				CustomRetailer retailer = pdfModel.getRetailer();
299
				boolean stateGst = false;
300
				String customerAddressStateCode = "", retailerAddressStateCode = "";
301
				if (customer.getAddress().getState().equals(retailer.getAddress().getState())) {
302
					stateGst = true;
303
					customerAddressStateCode = Utils.getStateCode(customer.getAddress().getState());
304
				} else {
305
					customerAddressStateCode = Utils.getStateCode(customer.getAddress().getState());
306
					retailerAddressStateCode = Utils.getStateCode(retailer.getAddress().getState());
307
				}
308
				Set<CustomOrderItem> orderItems = pdfModel.getOrderItems();
309
 
310
				PdfWriter.getInstance(document, outputStream);
311
 
312
				document.open();
313
				document.addTitle(pdfModel.getTitle());
314
				document.addAuthor(pdfModel.getAuther());
315
 
23532 amit.gupta 316
				Paragraph paragraphTitle = new Paragraph(DEBIT_NOTE_TITLE, FONT_TITLE);
23509 amit.gupta 317
				paragraphTitle.setAlignment(Element.ALIGN_CENTER);
318
 
319
				PdfPCell blankCell = new PdfPCell();
320
				blankCell.setBorder(Rectangle.NO_BORDER);
321
				PdfPTable tableCustomerRetailer = new PdfPTable(3);
322
				tableCustomerRetailer.setWidthPercentage(90);
323
				tableCustomerRetailer.getDefaultCell().setBorder(Rectangle.NO_BORDER);
23532 amit.gupta 324
				PdfPCell partnerInfo = new PdfPCell();
325
				partnerInfo.addElement(new Paragraph(StringUtils.capitalize(customer.getAddress().getName()), FONT_NORMAL));
326
				partnerInfo.addElement(new Paragraph(StringUtils.capitalize(customer.getAddress().getLine1())
327
						+ customer.getAddress().getLine2() == null ?  "" : StringUtils.capitalize(retailer.getAddress().getLine2()) + ", "));
328
				partnerInfo.addElement(new Paragraph(
23509 amit.gupta 329
						StringUtils.capitalize(customer.getAddress().getCity()) + ", "
330
								+ StringUtils.capitalize(customer.getAddress().getState()) + "("
331
								+ customerAddressStateCode + ")" + "\n" + customer.getAddress().getPinCode(),
332
						FONT_NORMAL));
23532 amit.gupta 333
				partnerInfo.addElement(new Paragraph("Mobile - " + customer.getMobileNumber(), FONT_NORMAL));
23509 amit.gupta 334
				if (customer.getGstNumber() != null && !customer.getGstNumber().isEmpty()) {
23532 amit.gupta 335
					partnerInfo
23509 amit.gupta 336
							.addElement(new Paragraph("GST Number - " + customer.getGstNumber(), FONT_NORMAL));
337
				}
23532 amit.gupta 338
				partnerInfo.setBorder(Rectangle.NO_BORDER);
339
 
340
 
341
				PdfPCell sellerParty = new PdfPCell();
342
				sellerParty.addElement(new Paragraph(StringUtils.capitalize(retailer.getAddress().getName()), FONT_BOLD));
343
				sellerParty.addElement(new Paragraph(
344
						(retailer.getAddress().getLine1() == null ?  "" : StringUtils.capitalize(retailer.getAddress().getLine1()) + ", ")
345
						+ (retailer.getAddress().getLine2() == null ?  "" : StringUtils.capitalize(retailer.getAddress().getLine2()) + ", ")
23509 amit.gupta 346
						+ StringUtils.capitalize(retailer.getAddress().getCity()) + "-"
347
						+ retailer.getAddress().getPinCode() + ", " + retailer.getAddress().getState() + "("
348
						+ (stateGst ? customerAddressStateCode : retailerAddressStateCode) + ")", FONT_BOLD));
23532 amit.gupta 349
				sellerParty
23509 amit.gupta 350
						.addElement(new Paragraph("Contact No.- " + retailer.getAddress().getPhoneNumber(), FONT_BOLD));
23532 amit.gupta 351
				sellerParty.addElement(new Paragraph("GST NO. " + retailer.getGstNumber(), FONT_BOLD));
352
				sellerParty.setBorder(Rectangle.NO_BORDER);
23509 amit.gupta 353
 
354
				PdfPTable tableInvoiceDateRetailer = new PdfPTable(1);
355
				tableInvoiceDateRetailer.getDefaultCell().setBorder(Rectangle.NO_BORDER);
356
 
357
				PdfPTable tableInvoiceDate = new PdfPTable(2);
358
				tableInvoiceDate.getDefaultCell().setBorder(Rectangle.NO_BORDER);
359
 
23532 amit.gupta 360
				PdfPCell debitNoteNumberKey = new PdfPCell(new Paragraph("Debit Note No:", FONT_NORMAL));
361
				debitNoteNumberKey.setBorder(Rectangle.NO_BORDER);
362
				PdfPCell debitNoteNumberValue = new PdfPCell(new Paragraph(debitNotePdfModel.getDebitNoteNumber(), FONT_NORMAL));
363
				debitNoteNumberValue.setBorder(Rectangle.NO_BORDER);
364
 
365
				PdfPCell debitNoteDateKey = new PdfPCell(new Paragraph("Debit Note Dt:", FONT_NORMAL));
366
				debitNoteDateKey.setBorder(Rectangle.NO_BORDER);
367
 
368
				PdfPCell debitNoteDateValue = new PdfPCell(new Paragraph(debitNotePdfModel.getDebitNoteDate(), FONT_NORMAL));
369
				debitNoteDateValue.setBorder(Rectangle.NO_BORDER);
370
 
371
				PdfPCell invoiceNumberKey = new PdfPCell(new Paragraph("For Invoice No:", FONT_NORMAL));
23509 amit.gupta 372
				invoiceNumberKey.setBorder(Rectangle.NO_BORDER);
373
				PdfPCell invoiceNumberValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceNumber(), FONT_NORMAL));
374
				invoiceNumberValue.setBorder(Rectangle.NO_BORDER);
375
 
23532 amit.gupta 376
				PdfPCell dateKey = new PdfPCell(new Paragraph("Invoice Dt:", FONT_NORMAL));
23509 amit.gupta 377
				dateKey.setBorder(Rectangle.NO_BORDER);
378
				PdfPCell dateValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceDate(), FONT_NORMAL));
379
				dateValue.setBorder(Rectangle.NO_BORDER);
23532 amit.gupta 380
 
381
				tableInvoiceDate.addCell(debitNoteNumberKey);
382
				tableInvoiceDate.addCell(debitNoteNumberValue);
383
 
384
				tableInvoiceDate.addCell(debitNoteDateKey);
385
				tableInvoiceDate.addCell(debitNoteDateValue);
386
 
23509 amit.gupta 387
				tableInvoiceDate.addCell(invoiceNumberKey);
388
				tableInvoiceDate.addCell(invoiceNumberValue);
23532 amit.gupta 389
 
23509 amit.gupta 390
				tableInvoiceDate.addCell(dateKey);
391
				tableInvoiceDate.addCell(dateValue);
392
				tableInvoiceDateRetailer.addCell(tableInvoiceDate);
23532 amit.gupta 393
				tableInvoiceDateRetailer.addCell(sellerParty);
23509 amit.gupta 394
 
23532 amit.gupta 395
				tableCustomerRetailer.addCell(partnerInfo);
23509 amit.gupta 396
				tableCustomerRetailer.addCell(blankCell);
397
				tableCustomerRetailer.addCell(tableInvoiceDateRetailer);
398
 
399
				PdfPTable orders = null;
400
				if (stateGst) {
23532 amit.gupta 401
					orders = new PdfPTable(stateWidths.length);
402
					orders.setWidths(stateWidths);
23509 amit.gupta 403
				} else {
23532 amit.gupta 404
					orders = new PdfPTable(igstWidths.length);
405
					orders.setWidths(igstWidths);
23509 amit.gupta 406
				}
407
				orders.setWidthPercentage(90);
408
				orders.addCell(new Paragraph("Sl", FONT_BOLD));
409
				orders.addCell(new Paragraph("Description", FONT_BOLD));
410
				orders.addCell(new Paragraph("HSN", FONT_BOLD));
411
				orders.addCell(new Paragraph("Qty", FONT_BOLD));
412
				orders.addCell(new Paragraph("Rate\n(Per pc)", FONT_BOLD));
413
				orders.addCell(new Paragraph("Total\nTaxable", FONT_BOLD));
414
				if (!stateGst) {
415
					orders.addCell(new Paragraph("IGST\n%", FONT_BOLD));
416
					orders.addCell(new Paragraph("IGST", FONT_BOLD));
417
					// orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1});
418
					// total 8f
419
				} else {
420
					orders.addCell(new Paragraph("CGST %", FONT_BOLD));
421
					orders.addCell(new Paragraph("CGST", FONT_BOLD));
422
					orders.addCell(new Paragraph("SGST %", FONT_BOLD));
423
					orders.addCell(new Paragraph("SGST", FONT_BOLD));
424
					// orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1, 1,
425
					// 1});
426
					// total 8f
427
				}
428
				orders.addCell(new Paragraph("Total", FONT_BOLD));
429
 
430
 
431
				orders.setHeaderRows(1);
432
 
433
				float igstTotalAmount = 0, cgstTotalAmount = 0, sgstTotalAmount = 0;
434
				int index = 1;
435
				for (CustomOrderItem orderItem : orderItems) {
436
					orders.addCell(new Paragraph(String.valueOf(index++), FONT_NORMAL));
437
					orders.addCell(new Paragraph(orderItem.getDescription(), FONT_NORMAL));
438
					orders.addCell(new Paragraph(orderItem.getHsnCode(), FONT_NORMAL));
439
					orders.addCell(new Paragraph(String.valueOf(orderItem.getQuantity()), FONT_NORMAL));
440
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getRate()), FONT_NORMAL));
441
					orders.addCell(new Paragraph(String.format("%.2f", orderItem.getAmount()), FONT_NORMAL));
442
					if (!stateGst) {
443
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstRate()), FONT_NORMAL));
444
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstAmount()), FONT_NORMAL));
445
						igstTotalAmount = igstTotalAmount + orderItem.getIgstAmount();
446
					} else {
447
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstRate()), FONT_NORMAL));
448
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstAmount()), FONT_NORMAL));
449
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstRate()), FONT_NORMAL));
450
						orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstAmount()), FONT_NORMAL));
451
						cgstTotalAmount = cgstTotalAmount + orderItem.getCgstAmount();
452
						sgstTotalAmount = sgstTotalAmount + orderItem.getSgstAmount();
453
					}
454
					orders.addCell(new Paragraph(String.format("%.0f", orderItem.getNetAmount()), FONT_NORMAL));
455
					// orders.addCell(new Paragraph(String.format("%.2f",
456
					// orderItem.getItemTotal()), FONT_NORMAL));
457
				}
458
 
459
				document.add(paragraphTitle);
460
				document.add(Chunk.NEWLINE);
461
				document.add(Chunk.NEWLINE);
462
				document.add(tableCustomerRetailer);
463
 
464
				document.add(Chunk.NEWLINE);
465
				document.add(orders);
466
 
467
				PdfPTable grandTotalTable = new PdfPTable(3);
468
				if (stateGst) {
469
					grandTotalTable.setWidths(new float[] { 6.6f, .6f, .8f });
470
				} else {
471
					grandTotalTable.setWidths(new float[] { 6.5f, .6f, .9f });
472
				}
473
				grandTotalTable.setWidthPercentage(90);
474
 
475
				Paragraph grandTotalParagraph = new Paragraph("Grand total", FONT_BOLD);
476
				grandTotalParagraph.setIndentationRight(20);
477
				grandTotalTable.addCell(grandTotalParagraph);
478
				Paragraph rsParagraph = new Paragraph("Rs.", FONT_BOLD);
479
				grandTotalTable.addCell(rsParagraph);
480
				Paragraph amountParagraph = new Paragraph(String.format("%.2f", pdfModel.getTotalAmount()), FONT_BOLD);
481
				grandTotalTable.addCell(amountParagraph);
482
 
483
				document.add(grandTotalTable);
484
 
485
				PdfPTable amountInWordsTable = new PdfPTable(3);
486
				if (!stateGst) {
487
					amountInWordsTable.setWidths(new float[] { 2, 5.1f, 0.9f });
488
				} else {
489
					amountInWordsTable.setWidths(new float[] { 2, 5.2f, 0.8f });
490
				}
491
				amountInWordsTable.setWidthPercentage(90);
492
				amountInWordsTable.addCell(new Paragraph("Amount in Words:", FONT_BOLD));
493
 
494
				String amountInWords = toAmountInWords(pdfModel.getTotalAmount());
495
				amountInWordsTable.addCell(new Paragraph(amountInWords.toString(), FONT_BOLD));
496
				amountInWordsTable.addCell(new Paragraph("E & O.E", FONT_NORMAL));
497
				document.add(amountInWordsTable);
498
 
23532 amit.gupta 499
/*				StringBuffer sb = new StringBuffer();
23509 amit.gupta 500
				List<String> tncs = pdfModel.getTncs();
501
				for (String tnc : tncs) {
502
					sb.append(tnc).append("\n");
503
				}
504
 
505
				Paragraph warningParagraph = new Paragraph(sb.toString(), FONT_NORMAL);
506
				warningParagraph.setIndentationLeft(40);
507
				document.add(Chunk.NEWLINE);
23532 amit.gupta 508
				document.add(warningParagraph);*/
23509 amit.gupta 509
				document.newPage();
510
			}
511
			document.close(); // no need to close PDFwriter?
512
		} catch (DocumentException e) {
513
			LOGGER.error("Unable to write data to pdf file : ", e);
514
		} catch (Exception e) {
515
			// TODO Auto-generated catch block
516
			e.printStackTrace();
517
		}
21915 ashik.ali 518
	}
23509 amit.gupta 519
 
520
	private static String toAmountInWords(float amount) {
521
		RuleBasedNumberFormat amountInWordsFormat = new RuleBasedNumberFormat(indianLocale,
522
				RuleBasedNumberFormat.SPELLOUT);
523
		StringBuilder amountInWords = new StringBuilder("Rs. ");
524
		amountInWords.append(StringUtils.capitalize(amountInWordsFormat.format((int) amount)));
525
		amountInWords.append(" and ");
526
		amountInWords.append(StringUtils.capitalize(amountInWordsFormat.format((int) (amount * 100) % 100)));
527
		amountInWords.append(" paise");
528
		return amountInWords.toString();
529
	}
21686 ashik.ali 530
}