
    ʴ~j3`                     ,   d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZmZ ddlmZmZ dd	lmZmZmZmZmZmZ dd
lmZmZmZ d Z g dZ!g dZ"d Z#d Z$ddl%Z% e%jL                  e'      Z(da)da*d Z+d Z,d Z-ddZ.y)z
PDF receipt generator using reportlab.

Generates a professional receipt PDF with trust branding for both
Donation Receipts (Income) and Payment Vouchers (Expense).
    N)Decimalsettings)colors)A4)mmcm)getSampleStyleSheetParagraphStyle)SimpleDocTemplate	ParagraphSpacerTable
TableStyle
HRFlowable)	TA_CENTERTA_LEFTTA_RIGHTc                 "   g d}d}|D ]  }t         j                  j                  |      r#t         j                  j                  |      r|} nJt         j                  j                  |      reddl}|j                  |      s{|j                  |      } n |syt        j                         }t        j                         j                  }t         j                  j                  |d| d      }t         j                  j                  |d| d      }	 t        |dd	      5 }	|	j                  |        ddd       |d
dddddddd| |g}
t        j                  |
ddd      }|j                   dk(  rt         j                  j                  |      rt        |d      5 }|j#                         }ddd       t         j                  j                  |      r	 t        j$                  |       t         j                  j                  |      r	 t        j$                  |       S S 	 t         j                  j                  |      r	 t        j$                  |       t         j                  j                  |      r	 t        j$                  |       yy# 1 sw Y   `xY w# 1 sw Y   xY w# t&        $ r Y w xY w# t&        $ r Y S w xY w# t&        $ r Y yw xY w# t&        $ r Y yw xY w# t&        $ r Y t         j                  j                  |      r&	 t        j$                  |       n# t&        $ r Y nw xY wt         j                  j                  |      r&	 t        j$                  |       y# t&        $ r Y yw xY wyw xY w# t         j                  j                  |      r&	 t        j$                  |       n# t&        $ r Y nw xY wt         j                  j                  |      r&	 t        j$                  |       w # t&        $ r Y w w xY ww xY w)z
    Render HTML to PDF using Headless Chromium / Edge if available.
    Returns PDF bytes on success, or None on failure/unavailable.
    This provides pixel-perfect browser display matching for Tamil Unicode fonts.
    )z<C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exez6C:\Program Files\Microsoft\Edge\Application\msedge.exez5C:\Program Files\Google\Chrome\Application\chrome.exez;C:\Program Files (x86)\Google\Chrome\Application\chrome.exezgoogle-chromezchromium-browserchromiummsedgeNr   receipt_z.htmlz.pdfwutf-8encodingz
--headlessz--disable-gpuz--no-sandboxz--disable-dev-shm-usagez--no-pdf-header-footerz--allow-file-access-from-filesz--disable-translatez--disable-features=Translatez--print-to-pdf=T   )capture_outputtexttimeoutrb)ospathisabsexistsshutilwhichtempfile
gettempdiruuiduuid4hexjoinopenwrite
subprocessrun
returncodereadremove	Exception)html_contentpossible_pathsbrowser_exer#   r&   temp_dir	unique_idtemp_html_pathtemp_pdf_pathfcmdresultpfpdf_datas                 F/var/www/kalinger_portal/trust-backend/accounting/receipt_generator.py render_pdf_with_headless_browserrC      sq   	N K 77==277>>$#7Kt$||D!$ll40 ""$H

  IWW\\(hyk,GHNGGLLXi[+EFM$.#8 	"AGGL!	" %$,!*m_-
 DtRP!bggnn]&CmT* %b779%
 77>>.)		.) 77>>-(		-( )  77>>.)		.) 77>>-(		-( )?	" 	"&% %  
    
    77>>.)		.) 77>>-(		-(  ) 77>>.)		.) 77>>-(		-(  )s	  K) $J6A+K) !J!2	K) J-J<K =K JK) !J*&K) -	J98J9<	KK	KK	K&%K&)	M?2N L) )	L54L5M. .	M:9M:>M??N  P#N98P9	OPO"P(O>=P>	P
P	P

P) OneTwoThreeFourFiveSixSevenEightNineTenElevenTwelveThirteenFourteenFifteenSixteen	SeventeenEighteenNineteen)
rD   rD   TwentyThirtyFortyFiftySixtySeventyEightyNinetyc                 >   | dk(  ry| dk  rdt        |        z   S g }| dk\  r%|j                  t        | dz        dz          | dz  } | dk\  r%|j                  t        | dz        dz          | dz  } | dk\  r%|j                  t        | dz        d	z          | dz  } | d
k\  r#|j                  t        | d
z     dz          | d
z  } | dk\  r |j                  t        | dz            | dz  } d| cxk  rdk  rn n|j                  t        |           dj	                  |      S )z7Convert an integer to English words (Indian numbering).r   ZerozMinus i z Crorei z Lakhi  z	 Thousandd   z Hundred   
    )_number_to_wordsappend_ONES_TENSr-   )npartss     rB   rf   rf   v   s%   Av1u*A2...EL%a<&788CD	\H}%a8m4w>?	XEz%a5j1K?@	U
CxU18_z12	SBwU17^$	R1zrzU1X88E?    c                     t        t        |             } t        |       }t        t        | |z
  dz              }dt	        |       }|dkD  r|dt	        |       dz  }|dz  }|S )u   
    Convert a Decimal amount to Indian-English words.
    e.g. 1234.50 → "Rupees One Thousand Two Hundred Thirty Four and Fifty Paise Only"
    rb   zRupees r   z and z Paisez Only)r   strintroundrf   )amountrupeespaisewordss       rB   amount_to_wordsru      sv    
 S[!F[Fv#-./E&v./0Eqy5)%0188	WELrl   c                     t         rt         t        fS t        j                  j	                  t
        j                  ddd      } t        j                  j                  |       rG	 ddlm	} ddl
m} d|j                         vr|j                   |d|              da | at         t        fS d	a d
at         t        fS # t        $ r1}t        j!                  d|        d	a d
aY d
}~t         t        fS d
}~ww xY w)z<Register NotoSansTamil TTF font with ReportLab if available.
accountingfontszNotoSansTamil-Regular.ttfr   )
pdfmetrics)TTFontNotoSansTamilz4Failed to register NotoSansTamil font in ReportLab: 	HelveticaN)_REGISTERED_TAMIL_FONT_NAME_REGISTERED_TAMIL_FONT_PATHr"   r#   r-   r   BASE_DIRr%   reportlab.pdfbasery   reportlab.pdfbase.ttfontsrz   getRegisteredFontNamesregisterFontr5   loggerwarning)	font_pathry   rz   es       rB   register_tamil_fontr      s     #*,GGGX..gGbcI	ww~~i 
	/48j&G&G&II''	(JK*9'*3' '(CCC '2#&*#&(CCC  	/NNQRSQTUV*5'*.'
 '(CCC	/s   #:B9 9	C3C..C3c                  ,    t        t        ddddd      S )z+Return trust branding config from settings.TRUST_CONFIGzKalinga Temple TrustrD   N)nameaddress	logo_path)getattrr    rl   rB   get_trust_configr      s!    8^&.  rl   c                 "   ddl m} t               \  }}t               }| j                  j                         }|s G d d      } ||       }t        j                         }t        |t        dt        z  dt        z  dt        z  dt        z        }t               }	t        d|	d	   |d
t        dt        z  t        j                  d            }
t        d|	d   |dt        t        j                  d      dt        z        }t        d|	d   |dt        j                  d            }t        d|	d   |dt        j                  d            }t        d|	d   |dt        t        j                  d      dt        z  dt        z        }t        d|	d   |dt        j                  d      t        dt        z  dt        z         }g }t        d!|	d   d"t        t        j                  d#      dt        z  $      }|j!                  t#        d%|             |j!                  t#        |j%                  d&d'      |
             |j%                  d(      r|j!                  t#        |d(   |             |j!                  t'        d)dt        j                  d*      dt        z  dt        z  +             |j(                  d,k(  rd-nd.}|j!                  t#        ||             t#        d/| j*                   |	d         t#        d0|j,                  j/                  d1       t        d2|	d   t0        3            gg}t3        |d4d4g5      }|j5                  t7        d6g             |j!                  |       |j!                  t9        ddt        z               |j:                  d7k(  }d8|j<                  j>                  f|rd9nd:|r|j@                  d;nd<|j@                  d;fd=|rd>|jB                   d?n|jE                         fg}|j(                  d,k(  r|j!                  d@|jF                  xs dAf       |j!                  dB|jH                  xs dAf       |jJ                  rA|j!                  dC|jJ                  j>                   dD|jJ                  jL                   d?f       |jN                  r|j!                  dE|jN                  f       ns|j!                  dF|jP                  xs dAf       |jR                  r|j!                  dG|jR                  f       |jT                  r|j!                  dH|jT                  f       |jV                  jY                         }	 |jV                  jZ                  j>                  }|j!                  dI|f       |D cg c]*  \  }}t#        dJ| dK|      t#        ta        |      |      g, }}}t3        |dLt        z  dMg5      }|j5                  t7        d6dNdOdPdQdRdSt        j                  dT      fdPdUdVdSt        j                  d*      fg             |j!                  |       tc        |j@                        }|j!                  t#        dW| d?|             |j!                  t9        ddt        z               |j!                  t'        d)dSt        j                  dX      Y             |j!                  t9        ddt        z               t#        dZt        d[|	d   d\t        j                  d]      ^            t#        d_t        d[|	d   d\t        j                  d]      t0        `            gt#        da|	d         t#        dat        db|	d   t0        3            gg}t3        |d4d4g5      }|j5                  t7        dcg             |j!                  |       |je                  |       |jg                         S # t\        $ r5 	 |jV                  j^                  j>                  }n# t\        $ r Y nw xY wY w xY wc c}}w )dzv
    Generate a receipt PDF for the given Receipt instance using ReportLab.
    Returns the PDF content as bytes.
       )Receiptc                       e Zd Zd Zd Zy)8generate_receipt_pdf_reportlab.<locals>.DummyTransactionc                    d| _         |j                  | _        |j                  | _        |j                  | _        |j                  | _        |j                  r|j                  j                  nd| _        |j                  r|j                  j                  nd| _
        |j                  r|j                  j                  nd| _        d| _        |j                  | _         G d d      } |       | _        y )NCREDITrD   zAccount head breakdown receiptc                       e Zd ZdZy)Tgenerate_receipt_pdf_reportlab.<locals>.DummyTransaction.__init__.<locals>.DummyHeadzBreakdown ReceiptsN)__name__
__module____qualname__r   r   rl   rB   	DummyHeadr      s    /Drl   r   )transaction_typereceipt_datetransaction_datepayment_modetotal_amountrq   memberr   
donor_namename_tadonor_name_taphonedonor_contactpurpose
created_by
entered_byaccount_head)selfrr   s      rB   __init__zAgenerate_receipt_pdf_reportlab.<locals>.DummyTransaction.__init__   s    (0%()%$%NN!nnhh3488!((--9:QXX%5%5r"78xxQXX^^R"?"#,,0 0$-K!rl   c                     | j                   S )N)r   )r   s    rB   get_payment_mode_displayzQgenerate_receipt_pdf_reportlab.<locals>.DummyTransaction.get_payment_mode_display   s    (((rl   N)r   r   r   r   r   r   rl   rB   DummyTransactionr      s    0)rl   r   rc   r   )pagesize
leftMarginrightMargin	topMarginbottomMarginReceiptTitleHeading1      z#1a1a1a)parentfontNamefontSize	alignment
spaceAfter	textColorReceiptSubtitleNormalrd   z#6b7280   )r   r   r   r   r   r   Label)r   r   r   r   Value   ReceiptTypeHeading2   z#4338ca   )r   r   r   r   r   r   spaceBeforeAmountWordsz#374151)r   r   r   r   r   r   r   SriRamajeyam   z#d97706)r   r   r   r   r   u5   ஸ்ரீ ராமஜெயம் | Sri Ramajeyamr   Trustr   z100%z#e5e7eb)width	thicknesscolorr   r   r   zDONATION RECEIPTzPAYMENT VOUCHERz<b>Receipt No:</b> z<b>Date:</b> %d-%b-%Y
RightAlign)r   r   z50%)	colWidths)VALIGNr   r   r   TOPCommoditieszAccount HeadzQuantity (Weight)Amountz,.2fu   ₹ zPayment ModezCommodities ()z
Donor Nameu   —ContactMemberz (zPurpose / RemarkszPaid ToDescriptionzBill Referencez
Entered Byz<b>z</b>(   N)
TOPPADDINGr   r      )BOTTOMPADDINGr   r   r   	LINEBELOWr   )r   g      ?z#f3f4f6)r   r   r   (z#d1d5db)r   r   r   zReceived BySigLabel	   z#9ca3af)r   r   r   zAuthorized Signatory)r   r   r   r   _________________________RightSig)r   r   r   BOTTOM)4modelsr   r   r   transactionsfirstioBytesIOr   r   r   r
   r   r   r   HexColorrg   r   getr   r   receipt_numberr   strftimer   r   setStyler   r   r   r   r   rq   commodity_typer   r   r   r   	member_idr   paid_topurpose_descriptionbill_referencer   get_usernamestaff_profiler5   member_profilern   ru   buildgetvalue)receiptr   	font_name_configtransactionr   bufdocstylestitle_stylesubtitle_stylelabel_stylevalue_stylereceipt_type_styleamount_words_styleelementssri_ramajeyam_stylereceipt_labelheader_dataheader_tableis_commoditydetail_rowsentered_by_namelabelvalue
table_datadetail_tablert   sig_data	sig_tables                                  rB   generate_receipt_pdf_reportlabr     s   
  &(LIqF &&,,.K	) 	)" 'w/
**,C
7Gr'"WC !"F !j!r6//),K $h//),r6N !h//),K !h//),K (j!//),r6F	 (h//),Fr6	 H )h//),r6 OOIUWjklOOIfjj9;GHzz)	&"3^DEOOJ)CFq2v  *::hF  OOIm-?@A
 +G,B,B+CDfXFVW < < E Ej QRS|F84DPXY	
K ?L*+&   OOL!OOF1a"f%& ++}<L	11667 ,	(\h{?Q?QRV>Wpt  vA  vH  vH  IM  uN  oO  	P	,=)C)C(DAF\g  ]A  ]A  ]C  	DK ##x/L+*@*@*IEJKI{'@'@'IEJK%%**+2k.@.@.J.J-K1M    3[5H5HIJI{':':'CeDE**{/N/NOP%% 0+2L2LMN ",,99;O%00>>CC o67 (
 E5 E7$'5c%j+.	
J  R?L*++.	fhV__Y-GH	gxfooi.HI&   OOL! K../EOOI%l,>?@OOF1b2g&' OOJ6??9+E  OOF1b2g&' m^6(#3fooi&@&  ,n6(#3fooi&@"/ 
	
 hx 01z&2BhW	
H( h5%.9Iz.#   OOI IIh<<>C  	)44CCHHO 		s<    _
 /`
	` _54`5	`>` ```c           
         ddl }ddl}ddl}ddl}ddlm} ddlm}m}	 ddl	m
}
  |j                  t              }	 t        |dd      }|r|j                  j                  |      s'|j                  j!                  |j"                  dd      }|j                  j                  |      r(t%        |d	d
      5 }|j'                         }ddd       nd}d}d}d}| j(                  rO| j(                  j*                  xs d}| j(                  j,                  xs d}| j(                  j.                  xs d}n>| j0                  xs d}| j0                  xs d}| j2                  rd| j2                   dnd}t        | dd      dk(  }| j0                  xs< | j(                  r.| j(                  j,                  xs | j(                  j*                  nd}| j2                  xs | j(                  r| j(                  j4                  xst | j(                  j2                  xs\ | j(                  j6                  rB| j(                  j6                  j,                  xs$ | j(                  j6                  j*                  ndnd}| j8                  xs d}t;        | j<                        }| j>                  r"| j>                  jA                  |dk(  rdnd      nd}ddl!m"} | j>                  r || j>                        nd}|dk(  r|r|n|}dddddddd}|jG                  | jH                  | jH                        }t        |d d      }d}|r|j                  j                  |      r	 t%        |d!      5 }|j'                         } ddd       d"}!|jK                         jM                  d#      s|jK                         jM                  d$      rd%}!n!|jK                         jM                  d&      rd'}!d(|! d) |jN                         jQ                  d
       }|sd+}tW               \  }#}$d}%|$re|j                  j                  |$      rJ	 t%        |$d!      5 }&|&j'                         }'ddd       d, |jN                  '      jQ                  d
       }%| j\                  j_                         }(ta        | j<                        })i d1|d2|d3|d4|d5|%d6|$d7|d8|d9|d:|d;|d<|d=|d>|d?|d@|dA|)| | j(                  r| j(                  nd|(||| j(                  r| j(                  n|||dB|dC}* |      }+ |	|*      },|+jc                  |,      }-|%r,dD|% dE|% dF}.dG|-vrdH|-v r|-j[                  dH|. dH      }-n|.|-z   }-te        |-      }/|/r|/S  |jf                         }0|
ji                   |jf                  |-jk                  d
            |0      }1|1jl                  s|0jo                         S tS        dI      # 1 sw Y   xY w# 1 sw Y   xY w# tR        $ r!}"|jU                  d*|"        d}Y d}"~""d}"~"ww xY w# 1 sw Y   xY w# tR        $ rM}"|jU                  d-|"        d.|j                  jY                  |$      j[                  d/d0      z   }%Y d}"~"d}"~"ww xY w# tR        $ r,}2|jq                  dJ|2 dKdLM       ts        |       cY d}2~2S d}2~2ww xY w)Nz
    Generate a receipt PDF using a configuration-driven HTML template layout.
    Falls back to reportlab in case of errors.
    r   Nr   )TemplateContext)pisaACTIVE_RECEIPT_TEMPLATErw   ztax_receipt_template.htmlr   r   r   u  
            <!DOCTYPE html>
            <html>
            <head>
                <meta charset="utf-8">
                <style>
                    body { font-family: Helvetica, sans-serif; padding: 20px; }
                    .header { text-align: center; font-size: 24px; font-weight: bold; margin-bottom: 20px; }
                    .field { margin: 10px 0; font-size: 14px; }
                    .sig { margin-top: 50px; text-align: right; }
                    .sig img { max-width: 150px; max-height: 50px; }
                </style>
            </head>
            <body>
                <div class="header">Receipt / Voucher</div>
                <div class="field">Receipt No: {{ receipt_no }}</div>
                <div class="field">Date: {{ receipt_date }} {% if tamil_date %}({{ tamil_date }}){% endif %}</div>
                <div class="field">Name: {{ name }} ({{ name_ta }})</div>
                <div class="field">Amount: ₹ {{ amount }}</div>
                {% if custodian_signature %}
                <div class="sig">
                    <p>Custodian Signature:</p>
                    <img src="{{ custodian_signature }}" />
                </div>
                {% endif %}
            </body>
            </html>
            rD   u   (தந்தை: r   receipt_typeTaxSeethanaenz%d/%m/%Yr   )get_tamil_datetau   ரொக்கம்u"   வங்கி கணக்குu   யுபிஐu   காசோலைu   கடனுக்காகu.   கையேட்டுப் பதிவுu   பொருட்கள்)CashzBank TransferUPIChequeCreditzJournal Entryr   CUSTODIAN_SIGNATURE_PATHr!   z	image/pngz.jpgz.jpegz
image/jpegz.gifz	image/gifzdata:z;base64,z*Failed to read custodian signature image: zNdata:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7zdata:font/ttf;base64,z/Failed to read font file for base64 embedding: zfile:///\/member_onlyis_seethanadonor_displayfather_displayfont_urlr   r   r   
receipt_norq   custodian_signaturer   
tamil_datedisplay_datepayment_mode_talangamount_in_words)r   r   r   )r  member_modelr   r   account_numberr   amount_paidzv
            <style>
            @font-face {
                font-family: 'NotoSansTamil';
                src: url('zu');
            }
            @font-face {
                font-family: 'Noto Sans Tamil';
                src: url('z');
            }
            body, table, td, th, p, span, div, h1, h2, h3, h4 {
                font-family: 'NotoSansTamil', 'Noto Sans Tamil', sans-serif !important;
            }
            </style>
            z
@font-facez</head>z#xhtml2pdf rendering error occurred.z%HTML template PDF generation failed: z. Falling back to ReportLab.T)exc_info):r"   loggingr   base64django.confr   django.templater   r!  	xhtml2pdfr"  	getLoggerr   r   r#   r%   r-   r   r.   r3   r   r   r   r   r   father_namefather_name_tafatherr   rn   r   r   r   accounting.utilsr(  r   r   lowerendswith	b64encodedecoder5   r   r   abspathreplacer   allru   renderrC   r   pisaDocumentencodeerrr  errorr  )3r  r1  r;  r"   rA  r   rB  r   r   r!  r"  r   template_pathr=   r6   r   r   r   r2  r3  r4  r6  rq   r   r(  tamil_date_strr9  payment_mode_mapr:  sig_pathr7  sfr  mimetyper   r  r   r5  ff	font_datar   r<  context_dicttemplatecontexthtml_renderedfont_cssheadless_pdfr?   pdfexcs3                                                      rB   generate_receipt_pdfrg    so   
 $1Wx(FB7*CTJBGGNN=$AGGLL):):LJefM 77>>-(mS7; (q vvx( (L< 	>>>>&&,"Dnn,,2G006BI%%+D((.BGGNGZGZ,W-@-@,AC`bIg~u=K**w`g`n`nw~~/E/E/\I\I\tv ,,  j  SZ  Sa  Sa1N1N  2ORYR`R`RlRl  2O  qx  q  q  qF  qFqxqq  rG  rG  rO  rO  rm  SZ  Sa  Sa  Sh  Sh  Sm  Sm  LN  gi++1r
W))*dkdxdxw++4444<ZU_`  A3AHAUAU(<(<=[]*.$,>~P\ ,A$*3M8
 +..w/C/CWEYEYZ 8%?F x0)(D) )R!wwyH) '>>#,,V48H8Q8QRY8Z+H^^%..v6*H(-hZx@P@P@PQY@Z@a@abi@j?k&l#
 #"r +,9	2V)T* *b "	I*23C63C3CI3N3U3UV]3^2_`
 ++//1)'*>*>?$
;$
;$
 ]$
 n	$
 $
 $
 D$
 w$
 *$
 f$
 "#6$
 L$
  .!$
" L#$
$ %$
& D'$
( )$
. .5nnGNN$( '(/gnn"&=
 "G$
L L),' 0  $* % $* %H =0-$1$9$9)zQXEY$ZM$,}$<M 8F 


=+?+?+H I6Rww??$$ABBm( (R) )  )!KA3OP&(#)* *  V!PQRPSTU%	(B(J(J4QT(UUVl  7<SEA]^imn-g667s   A:Z 6W'JZ X  W41BX 0Z 5X; X.,X; >C?Z >AZ Z 'W1,Z 4W>9X 	X+
X& Z &X++Z .X83X; ;	ZAZZ ZZ 	[	![>[	[	)Fr)  )/__doc__r   r"   rB  r0   r(   r*   decimalr   rC  r   reportlab.libr   reportlab.lib.pagesizesr   reportlab.lib.unitsr   r	   reportlab.lib.stylesr
   r   reportlab.platypusr   r   r   r   r   r   reportlab.lib.enumsr   r   r   rC   rh   ri   rf   ru   rA  rF  r   r   r}   r~   r   r   r  rg  r   rl   rB   <module>rp     s    
 	          & & D  = <H^		:( 			8	$" " D4nbQ7rl   