Subversion Repositories SmartDukaan

Rev

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