Monday, 14 April 2025

Thirmal Invoice Print Apex

 DECLARE

    CURSOR c_sale_master IS

        SELECT 

            m.SALE_ID,

            TO_CHAR(m.SALE_DATE, 'DD-MON-YYYY') AS SALE_DATE,

            m.CUSTOMER_NAME

        FROM SALE_MASTER m

        WHERE m.SALE_ID = :P1_SALE_ID;


    CURSOR c_sale_detail IS

        SELECT 

            d.PRODUCT_NAME,

            d.QUANTITY,

            d.PRICE,

            d.AMOUNT

        FROM SALE_DETAIL d

        WHERE d.SALE_ID = :P1_SALE_ID;


    v_total   NUMBER := 0;

    v_net     NUMBER := 0;

    v_cash    NUMBER := 200; -- Example cash received

    v_balance NUMBER := 0;

    v_sr      NUMBER := 1;

BEGIN

    HTP.P('<html><head><style>

        body { font-family: monospace; font-size: 12px; }

        .center { text-align: center; }

        .bold { font-weight: bold; }

        .invoice-box {

            max-width: 300px;

            margin: auto;

            border: 1px solid #000;

            padding: 10px;

        }

        table { width: 100%; border-collapse: collapse; margin-top: 10px; }

        th, td {

            border: 1px solid #000;

            padding: 4px;

            text-align: left;

        }

        .no-border td {

            border: none;

            padding: 2px 4px;

        }

        .summary td {

            font-weight: bold;

        }

        .thankyou {

            margin-top: 20px;

            text-align: center;

            font-size: 13px;

            font-weight: bold;

        }

    </style></head><body>');


    HTP.P('<div class="invoice-box">');

    HTP.P('<div class="center bold">ABC & CO.</div>');

    HTP.P('<div class="center">Example Road Test Street</div>');

    HTP.P('<div class="center">Ph: 123456789</div>');


    -- Master Info

    FOR m IN c_sale_master LOOP

        HTP.P('<table class="no-border" style="margin-top: 10px;">');

        HTP.P('<tr><td><strong>Bill No.:</strong></td><td>' || m.SALE_ID || '</td></tr>');

        HTP.P('<tr><td><strong>Customer:</strong></td><td>' || m.CUSTOMER_NAME || '</td></tr>');

        HTP.P('<tr><td><strong>Date:</strong></td><td>' || m.SALE_DATE || '</td></tr>');

        HTP.P('</table>');

    END LOOP;


    -- Detail Header

    HTP.P('<table>');

    HTP.P('<tr>

            <th>Sr #</th>

            <th>Description</th>

            <th>Qty</th>

            <th>Rate</th>

            <th>Amount</th>

           </tr>');


    -- Detail Rows

    FOR d IN c_sale_detail LOOP

        HTP.P('<tr>

                <td>' || v_sr || '</td>

                <td>' || d.PRODUCT_NAME || '</td>

                <td>' || d.QUANTITY || '</td>

                <td>' || d.PRICE || '</td>

                <td>' || d.AMOUNT || '</td>

              </tr>');

        v_total := v_total + d.AMOUNT;

        v_sr := v_sr + 1;

    END LOOP;


    HTP.P('</table>');


    -- Summary

    v_net := v_total - 100; -- assuming fixed discount

    v_balance := v_net - v_cash;


    HTP.P('<table class="summary" style="margin-top: 10px;">');

    HTP.P('<tr><td>Total Bill</td><td>' || v_total || '</td></tr>');

    HTP.P('<tr><td>Discount</td><td>100</td></tr>');

    HTP.P('<tr><td>Net Bill</td><td>' || v_net || '</td></tr>');

    HTP.P('<tr><td>Cash Receive</td><td>' || v_cash || '</td></tr>');

    HTP.P('<tr><td>COC</td><td>' || v_balance || '</td></tr>');

    HTP.P('</table>');


    -- Thank You Note

    HTP.P('<div class="thankyou">*** Thank You! Visit Again! ***</div>');

    HTP.P('</div>'); -- close invoice box

    HTP.P('</body></html>');

END;


No comments:

Post a Comment

Check Internet Connectivity on Local System

if (!navigator.onLine) {     showOfflineAlert(); } else {     // Set a strict 3-second network timeout threshold     const controller = new ...