Subversion Repositories SmartDukaan

Rev

Rev 33298 | Rev 33795 | 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);
33741 amit.gupta 69
            PdfWriter pdfWriter = PdfWriter.getInstance(document, outputStream);
32275 tejbeer 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();
33741 amit.gupta 336
                if(pdfModel.geteWayBillPdfModel()!=null) {
337
 
338
                    EWayBillPDF.generateDocument(document, pdfWriter, pdfModel.geteWayBillPdfModel());
339
                }
32275 tejbeer 340
            }
341
            document.close(); // no need to close PDFwriter?
32991 amit.gupta 342
            if(cancelledPages) {
343
                stampCancelled(outputStream, caneclledPageList);
344
            }
23509 amit.gupta 345
 
32275 tejbeer 346
        } catch (DocumentException e) {
347
            LOGGER.error("Unable to write data to pdf file : ", e);
348
        } catch (Exception e) {
349
            // TODO Auto-generated catch block
350
            e.printStackTrace();
351
        }
24506 amit.gupta 352
 
32275 tejbeer 353
    }
23509 amit.gupta 354
 
32980 amit.gupta 355
    private static void addIrnDetails(IrnModel irnModel, Rectangle rectangle, Document document) throws IOException, DocumentException {
356
        PdfPTable taxTable = new PdfPTable(1);
357
        taxTable.setWidthPercentage(45);
358
        PdfPCell pdfCell = new PdfPCell();
359
        pdfCell.setBorder(Rectangle.NO_BORDER);
360
        Image img = Image.getInstance(irnModel.getQrCode().toURI().toURL());
361
        img.setAbsolutePosition(450f, rectangle.getHeight() - 140);
362
        document.add(img);
363
        Paragraph irnParagraph = new Paragraph("IRN No - " + irnModel.getIrnNumber(), FONT_NORMAL);
364
        irnParagraph.setAlignment(Element.ALIGN_LEFT);
365
        pdfCell.addElement(irnParagraph);
366
 
367
        Paragraph ackParagraph = new Paragraph("Ack No - " + irnModel.getAcknowledgeNumber(),  FONT_NORMAL);
368
        ackParagraph.setAlignment(Element.ALIGN_LEFT);
369
        pdfCell.addElement(ackParagraph);
370
 
371
        Paragraph ackDateParagraph = new Paragraph("Ack Date - " + FormattingUtils.format(irnModel.getAcknowledgeDate()), FONT_NORMAL);
372
        ackDateParagraph.setAlignment(Element.ALIGN_LEFT);
373
        pdfCell.addElement(ackDateParagraph);
374
        taxTable.addCell(pdfCell);
375
        document.add(taxTable);
376
    }
377
 
32275 tejbeer 378
    private static void stampCancelled(ByteArrayOutputStream byteStream, List<Integer> cancelledPage) throws IOException, DocumentException {
379
        ByteArrayInputStream bais = new ByteArrayInputStream(byteStream.toByteArray());
380
        PdfReader pdfReader = new PdfReader(bais);
381
        int n = pdfReader.getNumberOfPages();
382
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
383
        PdfStamper pdfStamper = new PdfStamper(pdfReader, baos);
384
        pdfStamper.setRotateContents(false);
385
        // text watermark
386
        Font f = new Font(FontFamily.HELVETICA, 30);
387
        Phrase p = new Phrase("My watermark (text)", f);
388
        URL cancelledImgUrl = PdfUtils.class.getClassLoader().getResource("cancelled.png");
389
        URL waterMarkImgUrl = PdfUtils.class.getClassLoader().getResource("sd1.jpg");
390
        Image imgCancelled = Image.getInstance(cancelledImgUrl);
391
        Image imgWatermark = Image.getInstance(waterMarkImgUrl);
392
        imgWatermark.scaleAbsolute(imgWatermark.getScaledWidth() * 2.5f, imgWatermark.getScaledHeight() * 2.5f);
393
        float w = imgCancelled.getScaledWidth() / 2;
394
        float h = imgCancelled.getScaledHeight() / 2;
395
        float wWaterMark = imgWatermark.getScaledWidth() / 2;
396
        float hWatermark = imgWatermark.getScaledHeight() / 2;
397
        // transparency
398
        PdfGState gs1 = new PdfGState();
32980 amit.gupta 399
        gs1.setFillOpacity(0.4f);
32275 tejbeer 400
        PdfGState gs2 = new PdfGState();
32980 amit.gupta 401
        gs2.setFillOpacity(0.05f);
32275 tejbeer 402
        // properties
403
        PdfContentByte over;
404
        Rectangle pagesize;
405
        float x, y;
24506 amit.gupta 406
 
32275 tejbeer 407
        // loop over every page
408
        for (int i = 1; i <= n; i++) {
409
            pagesize = pdfReader.getPageSize(i);
410
            x = (pagesize.getLeft() + pagesize.getRight()) / 2;
411
            y = (pagesize.getTop() + pagesize.getBottom()) / 2;
412
            over = pdfStamper.getOverContent(i);
413
            over.saveState();
414
            if (cancelledPage.get(i - 1) == 1) {
415
                over.setGState(gs1);
416
                over.addImage(imgCancelled, w, 0, 0, h, x - (w / 2), y - (h / 2));
417
                over.restoreState();
418
            } else {
419
                over.setGState(gs2);
420
                over.addImage(imgWatermark, wWaterMark, 0, 0, hWatermark, x - (wWaterMark / 2), y - (hWatermark / 2));
421
                over.restoreState();
422
            }
423
        }
424
        pdfStamper.close();
425
        pdfReader.close();
426
        baos.writeTo(byteStream);
24845 amit.gupta 427
 
32275 tejbeer 428
    }
24506 amit.gupta 429
 
32275 tejbeer 430
    public static void generateAndWriteDebitNote(List<DebitNotePdfModel> debitNotePdfModels, OutputStream outputStream) {
431
        Document document = new Document();
432
        document.setMargins(0, 0, 25, 0);
433
        try {
434
            for (DebitNotePdfModel debitNotePdfModel : debitNotePdfModels) {
23509 amit.gupta 435
 
32275 tejbeer 436
                InvoicePdfModel pdfModel = debitNotePdfModel.getPdfModel();
437
                CustomCustomer customer = pdfModel.getCustomer();
438
                CustomRetailer retailer = pdfModel.getRetailer();
439
                boolean stateGst = false;
32290 tejbeer 440
 
441
                LOGGER.info("Customer - {}", customer.getAddress().getState());
442
                LOGGER.info("retailer - {}", retailer.getAddress().getState());
443
 
444
 
32292 tejbeer 445
                if (customer.getAddress().getState().equals(retailer.getAddress().getState())) {
446
                    stateGst = true;
447
                }
33298 amit.gupta 448
                List<CustomOrderItem> orderItems = pdfModel.getOrderItems();
23509 amit.gupta 449
 
32275 tejbeer 450
                PdfWriter.getInstance(document, outputStream);
23509 amit.gupta 451
 
32275 tejbeer 452
                document.open();
453
                document.addTitle(pdfModel.getTitle());
454
                document.addAuthor(pdfModel.getAuther());
23509 amit.gupta 455
 
32275 tejbeer 456
                Paragraph paragraphTitle = new Paragraph(pdfModel.getTitle(), FONT_TITLE);
457
                paragraphTitle.setAlignment(Element.ALIGN_CENTER);
23509 amit.gupta 458
 
32275 tejbeer 459
                PdfPCell blankCell = new PdfPCell();
460
                blankCell.setBorder(Rectangle.NO_BORDER);
461
                PdfPTable tableCustomerRetailer = new PdfPTable(3);
462
                tableCustomerRetailer.setWidthPercentage(95);
463
                PdfPCell partnerInfo = new PdfPCell();
464
                partnerInfo.addElement(new Paragraph("From Party:", FONT_BOLD));
465
                partnerInfo.addElement(
466
                        new Paragraph(StringUtils.capitalize(customer.getAddress().getName()), FONT_NORMAL));
467
                partnerInfo.addElement(new Paragraph(
32289 tejbeer 468
                        (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 469
 
32275 tejbeer 470
                partnerInfo.addElement(new Paragraph(
471
                        StringUtils.capitalize(customer.getAddress().getState()) + "(" + pdfModel.getCustomerAddressStateCode() + ")", FONT_NORMAL));
472
                partnerInfo.addElement(new Paragraph("Mobile - " + customer.getMobileNumber(), FONT_NORMAL));
473
                if (customer.getGstNumber() != null && !customer.getGstNumber().isEmpty()) {
474
                    partnerInfo.addElement(new Paragraph("GST No - " + customer.getGstNumber(), FONT_BOLD));
475
                }
23533 amit.gupta 476
 
32275 tejbeer 477
                PdfPCell sellerParty = new PdfPCell();
478
                sellerParty.addElement(new Paragraph("To Party:", FONT_BOLD));
479
                sellerParty.addElement(
480
                        new Paragraph(StringUtils.capitalize(retailer.getAddress().getName()), FONT_NORMAL));
32289 tejbeer 481
                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 482
                sellerParty.addElement(new Paragraph(
483
                        retailer.getAddress().getState() + "(" + pdfModel.getPartnerAddressStateCode() + ")", FONT_NORMAL));
484
                sellerParty.addElement(new Paragraph("Mobile - " + retailer.getAddress().getPhoneNumber(), FONT_NORMAL));
485
                sellerParty.addElement(new Paragraph("GST No - " + retailer.getGstNumber(), FONT_BOLD));
23509 amit.gupta 486
 
32275 tejbeer 487
                PdfPTable tableInvoiceDateRetailer = new PdfPTable(1);
488
                tableInvoiceDateRetailer.getDefaultCell().setBorder(Rectangle.NO_BORDER);
23509 amit.gupta 489
 
32275 tejbeer 490
                PdfPTable tableInvoiceDate = new PdfPTable(2);
491
                tableInvoiceDate.getDefaultCell().setBorder(Rectangle.NO_BORDER);
492
                tableInvoiceDate.setWidthPercentage(90);
23509 amit.gupta 493
 
32275 tejbeer 494
                PdfPCell debitNoteDetails = new PdfPCell(new Paragraph("Debit Note Details", FONT_BOLD));
495
                debitNoteDetails.setColspan(2);
496
                debitNoteDetails.setBorder(Rectangle.NO_BORDER);
23654 amit.gupta 497
 
32275 tejbeer 498
                PdfPCell debitNoteNumberKey = new PdfPCell(new Paragraph("Debit Note No:", FONT_NORMAL));
499
                debitNoteNumberKey.setBorder(Rectangle.NO_BORDER);
500
                PdfPCell debitNoteNumberValue = new PdfPCell(
501
                        new Paragraph(debitNotePdfModel.getDebitNoteNumber(), FONT_NORMAL));
502
                debitNoteNumberValue.setBorder(Rectangle.NO_BORDER);
23532 amit.gupta 503
 
32275 tejbeer 504
                PdfPCell debitNoteDateKey = new PdfPCell(new Paragraph("Debit Note Dt:", FONT_NORMAL));
505
                debitNoteDateKey.setBorder(Rectangle.NO_BORDER);
23533 amit.gupta 506
 
32275 tejbeer 507
                PdfPCell debitNoteDateValue = new PdfPCell(
508
                        new Paragraph(debitNotePdfModel.getDebitNoteDate(), FONT_NORMAL));
509
                debitNoteDateValue.setBorder(Rectangle.NO_BORDER);
23532 amit.gupta 510
 
32275 tejbeer 511
                PdfPCell invoiceNumberKey = new PdfPCell(new Paragraph("Invoice Ref No:", FONT_NORMAL));
512
                invoiceNumberKey.setBorder(Rectangle.NO_BORDER);
513
                PdfPCell invoiceNumberValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceNumber(), FONT_NORMAL));
514
                invoiceNumberValue.setBorder(Rectangle.NO_BORDER);
23509 amit.gupta 515
 
32275 tejbeer 516
                PdfPCell dateKey = new PdfPCell(new Paragraph("Invoice Dt:", FONT_NORMAL));
517
                dateKey.setBorder(Rectangle.NO_BORDER);
518
                PdfPCell dateValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceDate(), FONT_NORMAL));
519
                dateValue.setBorder(Rectangle.NO_BORDER);
23533 amit.gupta 520
 
32275 tejbeer 521
                tableInvoiceDate.addCell(debitNoteDetails);
522
                tableInvoiceDate.addCell(debitNoteNumberKey);
523
                tableInvoiceDate.addCell(debitNoteNumberValue);
524
                tableInvoiceDate.addCell(debitNoteDateKey);
525
                tableInvoiceDate.addCell(debitNoteDateValue);
526
                tableInvoiceDate.addCell(invoiceNumberKey);
527
                tableInvoiceDate.addCell(invoiceNumberValue);
528
                tableInvoiceDate.addCell(dateKey);
529
                tableInvoiceDate.addCell(dateValue);
23509 amit.gupta 530
 
32275 tejbeer 531
                tableCustomerRetailer.addCell(partnerInfo);
532
                tableCustomerRetailer.addCell(tableInvoiceDate);
533
                tableCustomerRetailer.addCell(sellerParty);
23509 amit.gupta 534
 
32275 tejbeer 535
                PdfPTable orders = null;
536
                if (stateGst) {
537
                    orders = new PdfPTable(stateWidths.length);
538
                    orders.setWidths(stateWidths);
539
                } else {
540
                    orders = new PdfPTable(igstWidths.length);
541
                    orders.setWidths(igstWidths);
542
                }
543
                orders.setWidthPercentage(95);
544
                orders.addCell(new Paragraph("Order Id", FONT_BOLD));
545
                orders.addCell(new Paragraph("Description", FONT_BOLD));
546
                orders.addCell(new Paragraph("HSN", FONT_BOLD));
547
                orders.addCell(new Paragraph("Qty", FONT_BOLD));
548
                orders.addCell(new Paragraph("Rate\n(Per pc)", FONT_BOLD));
549
                orders.addCell(new Paragraph("Total\nTaxable", FONT_BOLD));
550
                if (!stateGst) {
551
                    orders.addCell(new Paragraph("IGST\n%", FONT_BOLD));
552
                    orders.addCell(new Paragraph("IGST", FONT_BOLD));
553
                    // orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1});
554
                    // total 8f
555
                } else {
556
                    orders.addCell(new Paragraph("CGST %", FONT_BOLD));
557
                    orders.addCell(new Paragraph("CGST", FONT_BOLD));
558
                    orders.addCell(new Paragraph("SGST %", FONT_BOLD));
559
                    orders.addCell(new Paragraph("SGST", FONT_BOLD));
560
                    // orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1, 1,
561
                    // 1});
562
                    // total 8f
563
                }
564
                orders.addCell(new Paragraph("Total", FONT_BOLD));
23509 amit.gupta 565
 
32275 tejbeer 566
                orders.setHeaderRows(1);
23509 amit.gupta 567
 
32275 tejbeer 568
                float igstTotalAmount = 0, cgstTotalAmount = 0, sgstTotalAmount = 0;
569
                for (CustomOrderItem orderItem : orderItems) {
570
                    orders.addCell(new Paragraph(String.valueOf(orderItem.getOrderId()), FONT_NORMAL));
571
                    orders.addCell(new Paragraph(orderItem.getDescription(), FONT_NORMAL));
572
                    orders.addCell(new Paragraph(orderItem.getHsnCode(), FONT_NORMAL));
573
                    orders.addCell(new Paragraph(String.valueOf(orderItem.getQuantity()), FONT_NORMAL));
574
                    orders.addCell(new Paragraph(String.format("%.2f", orderItem.getRate()), FONT_NORMAL));
575
                    orders.addCell(new Paragraph(String.format("%.2f", orderItem.getAmount()), FONT_NORMAL));
576
                    if (!stateGst) {
577
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstRate()), FONT_NORMAL));
578
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstAmount()), FONT_NORMAL));
579
                        igstTotalAmount = igstTotalAmount + orderItem.getIgstAmount();
580
                    } else {
581
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstRate()), FONT_NORMAL));
582
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstAmount()), FONT_NORMAL));
583
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstRate()), FONT_NORMAL));
584
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstAmount()), FONT_NORMAL));
585
                        cgstTotalAmount = cgstTotalAmount + orderItem.getCgstAmount();
586
                        sgstTotalAmount = sgstTotalAmount + orderItem.getSgstAmount();
587
                    }
588
                    orders.addCell(new Paragraph(String.format("%.0f", orderItem.getNetAmount()), FONT_NORMAL));
589
                    LOGGER.info("IN FOR LOOP");
590
                }
23509 amit.gupta 591
 
32275 tejbeer 592
                document.add(paragraphTitle);
23533 amit.gupta 593
 
32275 tejbeer 594
                document.add(Chunk.NEWLINE);
595
                document.add(tableCustomerRetailer);
23509 amit.gupta 596
 
32275 tejbeer 597
                document.add(Chunk.NEWLINE);
598
                document.add(orders);
23509 amit.gupta 599
 
32275 tejbeer 600
                PdfPTable grandTotalTable = new PdfPTable(3);
601
                if (stateGst) {
602
                    grandTotalTable.setWidths(new float[]{6.6f, .6f, .8f});
603
                } else {
604
                    grandTotalTable.setWidths(new float[]{6.5f, .6f, .9f});
605
                }
606
                grandTotalTable.setWidthPercentage(95);
23509 amit.gupta 607
 
32275 tejbeer 608
                Paragraph grandTotalParagraph = new Paragraph("Grand total", FONT_BOLD);
609
                grandTotalParagraph.setIndentationRight(20);
610
                grandTotalTable.addCell(grandTotalParagraph);
611
                Paragraph rsParagraph = new Paragraph("Rs.", FONT_BOLD);
612
                grandTotalTable.addCell(rsParagraph);
613
                Paragraph amountParagraph = new Paragraph(String.format("%.2f", pdfModel.getTotalAmount()), FONT_BOLD);
614
                grandTotalTable.addCell(amountParagraph);
23509 amit.gupta 615
 
32275 tejbeer 616
                document.add(grandTotalTable);
23509 amit.gupta 617
 
32275 tejbeer 618
                PdfPTable amountInWordsTable = new PdfPTable(3);
619
                if (!stateGst) {
620
                    amountInWordsTable.setWidths(new float[]{2, 5.1f, 0.9f});
621
                } else {
622
                    amountInWordsTable.setWidths(new float[]{2, 5.2f, 0.8f});
623
                }
624
                amountInWordsTable.setWidthPercentage(95);
625
                amountInWordsTable.addCell(new Paragraph("Amount in Words:", FONT_BOLD));
23509 amit.gupta 626
 
32275 tejbeer 627
                String amountInWords = toAmountInWords(pdfModel.getTotalAmount());
628
                amountInWordsTable.addCell(new Paragraph(amountInWords.toString(), FONT_BOLD));
629
                amountInWordsTable.addCell(new Paragraph("E & O.E", FONT_NORMAL));
630
                document.add(amountInWordsTable);
23509 amit.gupta 631
 
32275 tejbeer 632
                document.newPage();
633
            }
634
            document.close(); // no need to close PDFwriter?
30539 amit.gupta 635
 
32275 tejbeer 636
        } catch (DocumentException e) {
637
            LOGGER.error("Unable to write data to pdf file : ", e);
638
        } catch (Exception e) {
639
            // TODO Auto-generated catch block
640
            e.printStackTrace();
641
        }
642
    }
23509 amit.gupta 643
 
32275 tejbeer 644
    private static String toAmountInWords(float amount) {
645
        RuleBasedNumberFormat amountInWordsFormat = new RuleBasedNumberFormat(indianLocale, RuleBasedNumberFormat.SPELLOUT);
646
        StringBuilder amountInWords = new StringBuilder("Rs. ");
647
        amountInWords.append(StringUtils.capitalize(amountInWordsFormat.format((int) amount)));
648
        amountInWords.append(" and ");
649
        amountInWords.append(StringUtils.capitalize(amountInWordsFormat.format((int) (amount * 100) % 100)));
650
        amountInWords.append(" paise");
651
        return amountInWords.toString();
652
    }
23654 amit.gupta 653
 
32275 tejbeer 654
    public static void generateAndWriteCustomerCreditNotes(List<CreditNotePdfModel> creditNotes, OutputStream outputStream) {
655
        Document document = new Document();
656
        document.setMargins(0, 0, 25, 0);
657
        try {
658
            PdfWriter.getInstance(document, outputStream);
24506 amit.gupta 659
 
32275 tejbeer 660
            document.open();
661
            document.addTitle(creditNotes.get(0).getPdfModel().getTitle());
662
            document.addAuthor(creditNotes.get(0).getPdfModel().getAuther());
663
            for (CreditNotePdfModel creditNotePdfModel : creditNotes) {
664
                InvoicePdfModel pdfModel = creditNotePdfModel.getPdfModel();
665
                CustomCustomer customer = pdfModel.getCustomer();
666
                CustomRetailer retailer = pdfModel.getRetailer();
667
                boolean stateGst = false;
32290 tejbeer 668
 
32275 tejbeer 669
                if (customer.getAddress().getState().equals(retailer.getAddress().getState())) {
670
                    stateGst = true;
671
                }
33298 amit.gupta 672
                List<CustomOrderItem> orderItems = pdfModel.getOrderItems();
23654 amit.gupta 673
 
32275 tejbeer 674
                Paragraph paragraphTitle = new Paragraph(pdfModel.getTitle(), FONT_TITLE);
675
                paragraphTitle.setAlignment(Element.ALIGN_CENTER);
23654 amit.gupta 676
 
32275 tejbeer 677
                PdfPCell blankCell = new PdfPCell();
678
                blankCell.setBorder(Rectangle.NO_BORDER);
679
                PdfPTable tableCustomerRetailer = new PdfPTable(3);
680
                tableCustomerRetailer.setWidthPercentage(95);
681
                PdfPCell partnerInfo = new PdfPCell();
682
                partnerInfo.addElement(new Paragraph("To Party:", FONT_BOLD));
683
                partnerInfo.addElement(
684
                        new Paragraph(StringUtils.capitalize(customer.getAddress().getName()), FONT_NORMAL));
685
                partnerInfo.addElement(new Paragraph(
686
                        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 687
 
32275 tejbeer 688
                partnerInfo.addElement(new Paragraph(
689
                        StringUtils.capitalize(customer.getAddress().getState()) + "(" + pdfModel.getCustomerAddressStateCode() + ")", FONT_NORMAL));
690
                partnerInfo.addElement(new Paragraph("Mobile - " + customer.getMobileNumber(), FONT_NORMAL));
691
                if (customer.getGstNumber() != null && !customer.getGstNumber().isEmpty()) {
692
                    partnerInfo.addElement(new Paragraph("GST No - " + customer.getGstNumber(), FONT_BOLD));
693
                }
23654 amit.gupta 694
 
32275 tejbeer 695
                PdfPCell sellerParty = new PdfPCell();
696
                sellerParty.addElement(new Paragraph("From Party:", FONT_BOLD));
697
                sellerParty.addElement(
698
                        new Paragraph(StringUtils.capitalize(retailer.getAddress().getName()), FONT_NORMAL));
699
                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));
700
                sellerParty.addElement(new Paragraph(
701
                        retailer.getAddress().getState() + "(" + pdfModel.getPartnerAddressStateCode() + ")", FONT_NORMAL));
702
                sellerParty.addElement(new Paragraph("Mobile - " + retailer.getAddress().getPhoneNumber(), FONT_NORMAL));
703
                sellerParty.addElement(new Paragraph("GST No - " + retailer.getGstNumber(), FONT_BOLD));
23654 amit.gupta 704
 
32275 tejbeer 705
                PdfPTable tableInvoiceDateRetailer = new PdfPTable(1);
706
                tableInvoiceDateRetailer.getDefaultCell().setBorder(Rectangle.NO_BORDER);
23654 amit.gupta 707
 
32275 tejbeer 708
                PdfPTable tableInvoiceDate = new PdfPTable(2);
709
                tableInvoiceDate.getDefaultCell().setBorder(Rectangle.NO_BORDER);
710
                tableInvoiceDate.setWidthPercentage(90);
23654 amit.gupta 711
 
32275 tejbeer 712
                PdfPCell debitNoteDetails = new PdfPCell(new Paragraph("Credit Note Details", FONT_BOLD));
713
                debitNoteDetails.setColspan(2);
714
                debitNoteDetails.setBorder(Rectangle.NO_BORDER);
23654 amit.gupta 715
 
32275 tejbeer 716
                PdfPCell debitNoteNumberKey = new PdfPCell(new Paragraph("Credit Note No:", FONT_NORMAL));
717
                debitNoteNumberKey.setBorder(Rectangle.NO_BORDER);
718
                PdfPCell debitNoteNumberValue = new PdfPCell(
719
                        new Paragraph(creditNotePdfModel.getCreditNoteNumber(), FONT_NORMAL));
720
                debitNoteNumberValue.setBorder(Rectangle.NO_BORDER);
23654 amit.gupta 721
 
32275 tejbeer 722
                PdfPCell debitNoteDateKey = new PdfPCell(new Paragraph("Credit Note Dt:", FONT_NORMAL));
723
                debitNoteDateKey.setBorder(Rectangle.NO_BORDER);
23654 amit.gupta 724
 
32275 tejbeer 725
                PdfPCell debitNoteDateValue = new PdfPCell(
726
                        new Paragraph(creditNotePdfModel.getCreditNoteDate(), FONT_NORMAL));
727
                debitNoteDateValue.setBorder(Rectangle.NO_BORDER);
728
                tableInvoiceDate.addCell(debitNoteDetails);
729
                tableInvoiceDate.addCell(debitNoteNumberKey);
730
                tableInvoiceDate.addCell(debitNoteNumberValue);
731
                tableInvoiceDate.addCell(debitNoteDateKey);
732
                tableInvoiceDate.addCell(debitNoteDateValue);
32980 amit.gupta 733
                if (pdfModel.getInvoiceNumber() != null) {
32275 tejbeer 734
                    PdfPCell dateKey = new PdfPCell(new Paragraph("Invoice Dt:", FONT_NORMAL));
735
                    dateKey.setBorder(Rectangle.NO_BORDER);
736
                    PdfPCell dateValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceDate(), FONT_NORMAL));
737
                    dateValue.setBorder(Rectangle.NO_BORDER);
23654 amit.gupta 738
 
32275 tejbeer 739
                    PdfPCell invoiceNumberKey = new PdfPCell(new Paragraph("Invoice Ref No:", FONT_NORMAL));
740
                    invoiceNumberKey.setBorder(Rectangle.NO_BORDER);
741
                    PdfPCell invoiceNumberValue = new PdfPCell(new Paragraph(pdfModel.getInvoiceNumber(), FONT_NORMAL));
742
                    invoiceNumberValue.setBorder(Rectangle.NO_BORDER);
743
                    tableInvoiceDate.addCell(invoiceNumberKey);
744
                    tableInvoiceDate.addCell(invoiceNumberValue);
745
                    tableInvoiceDate.addCell(dateKey);
746
                    tableInvoiceDate.addCell(dateValue);
747
                }
31008 amit.gupta 748
 
32275 tejbeer 749
                tableCustomerRetailer.addCell(partnerInfo);
750
                tableCustomerRetailer.addCell(tableInvoiceDate);
751
                tableCustomerRetailer.addCell(sellerParty);
23654 amit.gupta 752
 
32275 tejbeer 753
                PdfPTable orders = null;
754
                if (stateGst) {
755
                    orders = new PdfPTable(stateWidthsCrNote.length);
756
                    orders.setWidths(stateWidthsCrNote);
757
                } else {
758
                    orders = new PdfPTable(igstWidthsCrNote.length);
759
                    orders.setWidths(igstWidthsCrNote);
760
                }
761
                orders.setWidthPercentage(95);
762
                orders.addCell(new Paragraph("Description", FONT_BOLD));
763
                orders.addCell(new Paragraph("HSN", FONT_BOLD));
764
                orders.addCell(new Paragraph("Qty", FONT_BOLD));
765
                orders.addCell(new Paragraph("Rate\n(Per pc)", FONT_BOLD));
766
                orders.addCell(new Paragraph("Total\nTaxable", FONT_BOLD));
767
                if (!stateGst) {
768
                    orders.addCell(new Paragraph("IGST%", FONT_BOLD));
769
                    orders.addCell(new Paragraph("IGST", FONT_BOLD));
770
                    // orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1});
771
                    // total 8f
772
                } else {
773
                    orders.addCell(new Paragraph("CGST %", FONT_BOLD));
774
                    orders.addCell(new Paragraph("CGST", FONT_BOLD));
775
                    orders.addCell(new Paragraph("SGST %", FONT_BOLD));
776
                    orders.addCell(new Paragraph("SGST", FONT_BOLD));
777
                    // orders.setWidths(new float[]{1, 3, 1, 1, 1, 1, 1, 1, 1,
778
                    // 1});
779
                    // total 8f
780
                }
781
                orders.addCell(new Paragraph("Total", FONT_BOLD));
23654 amit.gupta 782
 
32275 tejbeer 783
                orders.setHeaderRows(1);
23654 amit.gupta 784
 
32275 tejbeer 785
                float igstTotalAmount = 0, cgstTotalAmount = 0, sgstTotalAmount = 0;
786
                for (CustomOrderItem orderItem : orderItems) {
787
                    LOGGER.info("Custom Order Item - {}", orderItem);
788
                    orders.addCell(new Paragraph(orderItem.getDescription(), FONT_NORMAL));
789
                    orders.addCell(new Paragraph(orderItem.getHsnCode(), FONT_NORMAL));
790
                    orders.addCell(new Paragraph(String.valueOf(orderItem.getQuantity()), FONT_NORMAL));
791
                    orders.addCell(new Paragraph(String.format("%.2f", orderItem.getRate()), FONT_NORMAL));
792
                    orders.addCell(new Paragraph(String.format("%.2f", orderItem.getAmount()), FONT_NORMAL));
793
                    if (!stateGst) {
794
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstRate()), FONT_NORMAL));
795
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getIgstAmount()), FONT_NORMAL));
796
                        igstTotalAmount = igstTotalAmount + orderItem.getIgstAmount();
797
                    } else {
798
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstRate()), FONT_NORMAL));
799
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getCgstAmount()), FONT_NORMAL));
800
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstRate()), FONT_NORMAL));
801
                        orders.addCell(new Paragraph(String.format("%.2f", orderItem.getSgstAmount()), FONT_NORMAL));
802
                        cgstTotalAmount = cgstTotalAmount + orderItem.getCgstAmount();
803
                        sgstTotalAmount = sgstTotalAmount + orderItem.getSgstAmount();
804
                    }
805
                    orders.addCell(new Paragraph(String.format("%.0f", orderItem.getNetAmount()), FONT_NORMAL));
806
                    LOGGER.info("IN FOR LOOP");
807
                }
23654 amit.gupta 808
 
32275 tejbeer 809
                document.add(paragraphTitle);
23654 amit.gupta 810
 
32275 tejbeer 811
                document.add(Chunk.NEWLINE);
812
                document.add(tableCustomerRetailer);
23654 amit.gupta 813
 
32275 tejbeer 814
                document.add(Chunk.NEWLINE);
815
                document.add(orders);
23654 amit.gupta 816
 
32275 tejbeer 817
                PdfPTable grandTotalTable = new PdfPTable(3);
818
                if (stateGst) {
819
                    grandTotalTable.setWidths(new float[]{6.6f, .6f, .8f});
820
                } else {
821
                    grandTotalTable.setWidths(new float[]{6.5f, .6f, .9f});
822
                }
823
                grandTotalTable.setWidthPercentage(95);
23654 amit.gupta 824
 
32275 tejbeer 825
                Paragraph grandTotalParagraph = new Paragraph("Grand total", FONT_BOLD);
826
                grandTotalParagraph.setIndentationRight(20);
827
                grandTotalTable.addCell(grandTotalParagraph);
828
                Paragraph rsParagraph = new Paragraph("Rs.", FONT_BOLD);
829
                grandTotalTable.addCell(rsParagraph);
830
                Paragraph amountParagraph = new Paragraph(String.format("%.2f", pdfModel.getTotalAmount()), FONT_BOLD);
831
                grandTotalTable.addCell(amountParagraph);
23654 amit.gupta 832
 
32275 tejbeer 833
                document.add(grandTotalTable);
23654 amit.gupta 834
 
32275 tejbeer 835
                PdfPTable amountInWordsTable = new PdfPTable(3);
836
                if (!stateGst) {
837
                    amountInWordsTable.setWidths(new float[]{2, 5.1f, 0.9f});
838
                } else {
839
                    amountInWordsTable.setWidths(new float[]{2, 5.2f, 0.8f});
840
                }
841
                amountInWordsTable.setWidthPercentage(95);
842
                amountInWordsTable.addCell(new Paragraph("Amount in Words:", FONT_BOLD));
23654 amit.gupta 843
 
32275 tejbeer 844
                String amountInWords = toAmountInWords(pdfModel.getTotalAmount());
845
                amountInWordsTable.addCell(new Paragraph(amountInWords.toString(), FONT_BOLD));
846
                amountInWordsTable.addCell(new Paragraph("E & O.E", FONT_NORMAL));
847
                document.add(amountInWordsTable);
23654 amit.gupta 848
 
32275 tejbeer 849
                document.newPage();
850
            }
851
            document.close(); // no need to close PDFwriter?
852
        } catch (DocumentException e) {
853
            LOGGER.error("Unable to write data to pdf file : ", e);
854
        } catch (Exception e) {
855
            // TODO Auto-generated catch block
856
            e.printStackTrace();
857
        }
23654 amit.gupta 858
 
32275 tejbeer 859
    }
21686 ashik.ali 860
}