Subversion Repositories SmartDukaan

Rev

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