Subversion Repositories SmartDukaan

Rev

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