
    nj              	          d dl Z d dlmZ d dlmZ d dlmZ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 d d
lmZ d dlmZmZmZmZmZmZ d dlmZmZ d dlmZ d dlm Z m!Z! d dl"Z"d dl#Z#d dlm$Z$m%Z% d dl&m'Z' d dl(m(Z(  G d de)      Z* G d de)      Z+ G d de)      Z, G d de)      Z- G d de)      Z. G d de)      Z/ G d de)      Z0dZd!Z1d"e2d efd#Z3d$ed e4fd%Z5d$ed e4fd&Z6d$ed e4fd'Z7d d(l8m9Z9 d$ed e:fd)Z;d$ed e4fd*Z<d$ed e4fd+Z=d$ed e4fd,Z>d"e2d e4fd-Z?dZd.Z@d e
fd/ZAd0e
d1e2d"e2d dfd2ZBd3ed4eCd5eCd dfd6ZDd3ed7e4d dfd8ZEd3ed9e4d dfd:ZFd[d3ed;e4d<eCd dfd=ZGd3ed>eCd?eHd dfd@ZId\d3edAe:d?eHd dfdBZJd3edCe4d dfdDZKdEeHd e2fdFZLd[d3edGe4d<eCd dfdHZMd3edIe4d dfdJZNdKedLeCdMeCd dfdNZOdKed4eCd dfdOZPdKedPeCdQeCd dfdRZQd1e2d"e2dSe2d dfdTZRd"e2d1e2d dfdUZSd"e2dVe2d dfdWZTd"e2dXe2d dfdYZUy)]    N)load_workbook)PatternFill)BorderSide)	Worksheet)Workbook)copy)coordinate_from_stringcolumn_index_from_string)	CellRange)
MergedCell)CustomOrderTrackingDiscountOrdersPaymentOrderProductsDeliverySlot)SKUProducts)Users)ShopProductionUnit)Font	Alignment)Path)	num2wordsc                   (     e Zd Zdeddf fdZ xZS )OutputPDFNotFoundErrorvaluereturnNc                 r    || _         d| _        t        |   | j                   d| j                           y )Nz8Output pdf file not found, please check the output path.: r   messagesuper__init__selfr   	__class__s     TC:\Users\Saasvaap\Desktop\Akash\Saasvaap\DEMO\Navya-Bakers\bill_writer\BillWriter.pyr&   zOutputPDFNotFoundError.__init__   s1    
QDLL>DJJ<89    __name__
__module____qualname__strr&   __classcell__r)   s   @r*   r   r          :c :d : :r+   r   c                   (     e Zd Zdeddf fdZ xZS )ErrorConvertingPDFr   r    Nc                 r    || _         d| _        t        |   | j                   d| j                           y )Nz#Output pdf file generation failed!.r"   r#   r'   s     r*   r&   zErrorConvertingPDF.__init__   s1    
<DLL>DJJ<89r+   r,   r2   s   @r*   r5   r5      r3   r+   r5   c                   (     e Zd Zdeddf fdZ xZS )OuptputExcelNotFoundErrorr   r    Nc                 r    || _         d| _        t        |   | j                   d| j                           y )Nz:Output excel file not found, please check the output path.r"   r#   r'   s     r*   r&   z"OuptputExcelNotFoundError.__init__#   s1    
SDLL>DJJ<89r+   r,   r2   s   @r*   r8   r8   "   r3   r+   r8   c                   (     e Zd Zdeddf fdZ xZS )TemplateNotFoundErrorr   r    Nc                 r    || _         d| _        t        |   | j                   d| j                           y )Nz&Invalid template path, file not found.r"   r#   r'   s     r*   r&   zTemplateNotFoundError.__init__)   s1    
?DLL>DJJ<89r+   r,   r2   s   @r*   r;   r;   (   r3   r+   r;   c                         e Zd Zd fdZ xZS )OutputFolderCreationErrorc                 r    d| _         d| _        t        |   | j                   d| j                           y )NzPlease check permission issueszError creating Output Foldersr"   r#   )r(   r)   s    r*   r&   z"OutputFolderCreationError.__init__/   s1    5
6DLL>DJJ<89r+   r    N)r-   r.   r/   r&   r1   r2   s   @r*   r>   r>   .   s    : :r+   r>   c                   (     e Zd Zdeddf fdZ xZS )TemplateFileAlreadyOpenedr   r    Nc                 r    || _         d| _        t        |   | j                   d| j                           y )NzBTemplate file already opened, please close the file and try again.r"   r#   r'   s     r*   r&   z"TemplateFileAlreadyOpened.__init__5   s1    
[DLL>DJJ<89r+   r,   r2   s   @r*   rB   rB   4   r3   r+   rB   c                   (     e Zd Zdeddf fdZ xZS )DataNotFoundErrorr   r    Nc                 r    || _         d| _        t        |   | j                   d| j                           y )NzData Not Foundr"   r#   r'   s     r*   r&   zDataNotFoundError.__init__;   s1    
'DLL>DJJ<89r+   r,   r2   s   @r*   rE   rE   :   r3   r+   rE   r    c                 X    t         j                  j                  |       st        |       y N)ospathexistsr;   )template_paths    r*   _check_template_existrM   A   s"    77>>-(#M22 )r+   order_idc                 f    t         j                  j                  |       }|st        d|        |S )Norder_IDNo data found for order ID: )r   objectsgetrE   )rN   orders     r*   _fetch_order_datarV   F   s4    NN1E">xj IJJLr+   rU   c                    t         j                  j                  |       j                         }|st	        d| j
                         |j                  j
                  |j                  r|j                  j                  d      ndd}|S )NrU   z$No payment data found for order ID: %Y-%m-%dN/A)Invoice NumberInvoice Date)	r   rS   filterfirstrE   rQ   rU   payment_datestrftime)rU   paymentinvoice_detailss      r*   _fetch_invoice_detailsrc   M   sx    oo$$5$1779G"Fu~~FV WXX!--00ELEYEY,,55jA_dO r+   c                    	 | j                   r| j                   j                  d      nd}| j                  r| j                  j                  d      nd}|dk7  r| d| n|}| j                  rd| j                  dnd}| j                  r| j                  j
                  nd}| j                  rt        | j                  j                        nd}| j                  d	k7  r/t        j                  j                  | 
      j                         }nd}| j                  |||||d}t        j                   d|        |S # t"        $ r5}	t        j$                  d|	        t'        d| j                         d }	~	ww xY w)NrY   rZ   z%H:%M    ₹.2f   ₹0 Custom OrdersrX      )Order NoSlotPayable AmountPayment ModeSourceNo of itemszAdditional details: z#Error fetching additional details: z*No additional details found for order ID: )delivery_slot_dater`   delivery_slot_timegrand_totalpayment_mode	mode_name
store_uuidr0   	unit_name
order_typer   rS   r]   countrQ   logginginfo	ExceptionerrorrE   )
rU   rr   rs   slotpayable_amountru   sourceno_of_itemsadditional_detailses
             r*   _fetch_additional_detailsr   X   sw   _NSNfNfU55>>zJlqKPKcKcU55>>wGin?QUZ?Z$%Q'9&:;`r:?:K:K3u0056QW7<7I7Iu))33u494D4DU%%//0".'//66U6CIIKKK ,(&
 	+,>+?@A!! _;A3?@"LU^^L\ ]^^_s   D;D> >	E<0E77E<c                 @   	 | j                   rd| j                   dnd}| j                  rd| j                  dnd}| j                  rd| j                  dnd}| j                  rd| j                  dnd}||||d}|S #  t	        d| j
                         xY w)Nrf   rg   rh   )Handling ChargesDelivery Chargesr   zTotal Amountz%No other charges found for order ID: )coupon_savingsdelivery_chargesdiscountrt   rE   rQ   )rU   handling_chargesr   r   total_amountother_chargess         r*   _fetch_other_chargesr   x   s    Z?D?S?SS!5!5c :;Y_AFAWAWS!7!7 <=]c16S,-V8=8I8IU..s34v !1 0 (	
 Z"GGW XYYs   B B B)Qc                    	 | j                   dk7  r:t        j                  j                  |       }g }|D ]  }|j                  }|j
                  }t        |j
                  j                  xs d      }t        |j
                  j                  xs d      }t        |j
                  j                  xs d      }d}	t        j                  j                  t        d|j                  g      t        d|j                  g      z  t        d	|g
      z  t        d|g      z        }
|
D ]  }|j                  dk(  r*|j                  |j                  j!                         v r|}	 n|j                  dk(  r*|j                  |j"                  j!                         v r|}	 na|j                  d	k(  r ||j$                  j!                         v r|}	 n2|j                  dk(  s||j&                  j!                         v s|}	 n t        |j(                        }t        |j*                        }|	r(t        |	j,                        }t/        ||z  dz  d      }nd}t/        ||z  d      }t/        ||z  d      }||z   |z   dz  }t/        ||z
  |z  d      }t/        ||z
  |z   d      }|j0                  r4|j2                  r(|j4                   d|j0                   |j2                   }n|j4                  }||j6                  t9        |j;                         rt=        |      n|      |d|d|d||||d|dd}|j?                  |        |S t@        j                  j                  |       }tB        j                  jE                  | jF                        }|jH                  rt        |jH                        nd}g }|D ]  }|jJ                  r|jJ                  nd}|j*                   d| jM                         }t        |jN                  xs d      }d}t/        ||z
  |z   d      }dd||d|d|dddd|d|dd}|j?                  |        |S # tP        $ r }tS        d| jF                   d|       d}~ww xY w)uP  
    Returns item details with the updated calculation logic:

    - Gross Value   = Unit Price (MRP) × Quantity
    - Discount      = discount_per_unit × Quantity  (cumulative for all units)
    - Total Tax     = (Gross Value − Discount) × (CGST + SGST + CESS) / 100
    - Total Value   = Gross Value − Discount + Total Tax
    rj   rX   r   NCategory)
DiscountOnApplicableCategory__inSubCategory)r   ApplicableSubCategory__inProduct)r   ApplicableProduct__inSku)r   ApplicableSku__ind              -rg   )Item DescriptionHSN CodeQuantity
Unit PriceGross Valuer   CGST Rate(%) AmountSGST Rate AmountCESS Amount	Total TaxTotal Value)rN   rP   ri   re   zCustom Order ItemrZ   z$No item details found for order ID:  :: )*ry   r   rS   r]   skuproductfloatc_gsts_gstcessr   r   item_categoryitem_sub_categoryr   ApplicableCategoryallApplicableSubCategoryApplicableProductApplicableSkusku_mrpquantityDiscountPercentageroundsku_quantitysku_unitsku_namesku_coder0   
is_integerintappendr   r   rT   rQ   r   quantity_unitstriprt   r}   rE   )rU   itemsitem_detailsitemr   r   r   r   r   applicable_discount	discountsr   mrpr   discount_percentdiscount_per_unitgross_valuetotal_discounttax_rate	total_taxtotal_value	item_descitem_detailcustom_items	order_objdiscount_valqty_unitqty_displayr   s                                r*   _item_detailsr      s   s
.!))00u0=ELhh++ckk//415ckk//415ckk..415 '+#$,,33H]H]G^_7KdKdJefgwiPQ 3%HI	 !*H**j8W=R=RV^VqVqVuVuVw=w.6+!,,='B[B[_g_}_}  `B  `B  `D  CD.6+!,,	9gIcIcIgIgIi>i.6+!,,5#AWAWA[A[A]:].6+ !* !- / '(-.A.T.T(U$(-c4D.Ds.JA(N%(+% "'sX~q!9!&'88'CQ!G"'%-$"6#!=!&n(D'PRS!T	!&{^'Ci'OQR!S ###&<<.#2B2B1CCLL> RI #I *3),),h>Q>Q>SS]Ya)b,/9,7+<,:3+?+0+0+/,5c?,7+< ##K0I L   /66==u=ML!>>--u~~-FI8A8J8J5!3!34PSLL$484F4Fd00B!%q
;AAC#I$9$9$>Q? "	#K,$>$JAN *=).)4,7+<,7+<,8+=+/+/+/,5c?,7+< ##K0/ %2   
25>>2B$qcJ
 	

s,   GQ Q <EQ DQ 	Q<Q77Q<c                 j    	 | j                   | j                  z   }| j                  |d}|S #  d}Y xY w)Nr   )Totalz	Sub Total)	sub_totaltaxes_and_chargesrt   )rU   totaltotalss      r*   _totalr     s>    %"9"99 ((u=FMs   , 2c                  	   	 | j                   dk(  rf| j                  }|rg }|j                  r|j                  |j                         |j                  r|j                  |j                         |j
                  r|j                  |j
                         |j                  r|j                  |j                         |j                  r|j                  |j                         |j                  r$|j                  t        |j                               dj                  |      }nd}|r|j                  nd||r|j                  nd|r|j                  nd|rt        |d      r|j                  ndd}|S | j                   dk(  rf| j                   }|rg }|j"                  r|j                  |j"                         |j                  r|j                  |j                         |j
                  r|j                  |j
                         |j                  r|j                  |j                         |j                  r|j                  |j                         |j                  r$|j                  t        |j                               dj                  |      }nd}|r|j$                  nd||r|j                  nd|r|j                  nd|rt        |d      r|j                  ndd}|S | j                  }|rg }|j                  r|j                  |j                         |j                  r|j                  |j                         |j
                  r|j                  |j
                         |j                  r|j                  |j                         |j                  r|j                  |j                         |j                  r$|j                  t        |j                               dj                  |      }nd}|r|j                  nd||r|j                  nd|r|j                  nd|rt        |d      r|j                  ndd}|S # t&        $ r }t)        d| j*                   d|       d }~ww xY w)	NzLocal Orders
rZ   gstin)	Shop NameShop Address
Shop Phone
Shop Email
Shop GSTINzLong Distance Ordersz$No shop details found for order ID: r   )ry   rw   unit_locationr   streetcitydistrictstate_or_provincepin_coder0   joinrx   
contact_noemailhasattrr   pu_uuidpu_locationpu_namer}   rE   rQ   )	rU   shopshop_address_linesshop_addressshop_detailsproduction_unitproduction_unit_address_linesproduction_unit_addressr   s	            r*   _fetch_shop_detailsr     s   U`~-##D%'"%%&--d.@.@A;;&--dkk:99&--dii8==&--dmm<))&--d.D.DE==&--c$--.@A#yy);<$ 48U ,37U37

U.2wtW7M

SXL| o !77#mmO02-"..1889T9TU"))1889O9OP"''1889M9MN"++1889Q9QR"441889Z9Z["++188_=U=U9VW*.))4Q*R'*/' >M 7 7RW 7>M : :SX>M 5 5SX9HWUdfmMn 5 5tyLF 7 ##D%'"%%&--d.@.@A;;&--dkk:99&--dii8==&--dmm<))&--d.D.DE==&--c$--.@A#yy);<$ 48U ,37U37

U.2wtW7M

SXL  `"Fu~~FVVZ[\Z] ^__`s&   E5Q 8E5Q .E%Q 	Q=Q88Q=c                 >   	 | j                   }|st        d| j                         | j                  dk7  r;| j                  r.g }| j                  j
                  r%|j                  | j                  j
                         | j                  j                  r%|j                  | j                  j                         | j                  j                  r%|j                  | j                  j                         | j                  j                  r%|j                  | j                  j                         | j                  j                  r%|j                  | j                  j                         | j                  j                  r%|j                  | j                  j                         | j                  j                  r.|j                  t        | j                  j                               dj                  |      }| j                  j                  r| j                  j                  nd}| j                  j                   r| j                  j                   n|j"                  r|j"                  nd}n_d}|j$                  s|j&                  r)|j$                   d|j&                   j)                         nd}|j"                  r|j"                  nd}||||j*                  r|j*                  ndd}|S # t,        $ r }t        d| j                   d|       d }~ww xY w)	Nz$No user details found for order ID: zPick Upr   ri   rZ   re   )	User NameUser Address
User Phone
User Emailz::)	user_uuidrE   rQ   ry   drop_addresshouse_number_or_namer   r   	land_markr   r   r   r   r0   r   namecontact_numberphone_number
first_name	last_namer   r   r}   )rU   useruser_address_linesuser_address	user_namer  user_detailsr   s           r*   _fetch_user_detailsr  m  s   &^#&J5>>JZ$[\\y(U-?-?!#!!66"))%*<*<*Q*QR!!(("))%*<*<*C*CD!!++"))%*<*<*F*FG!!&&"))%*<*<*A*AB!!**"))%*<*<*E*EF!!33"))%*<*<*N*NO!!**"))#e.@.@.I.I*JK"ii(:;L9>9K9K9P9Pe0055VXICHCUCUCdCde00??  @D  @Q  @Qjnj{j{  W\N'LOSbfbpbp 14>>2BCIIKvxI373D3Dd//%N &(**.**DJJ%	
  ^"Fu~~FVVXYZX[ \]]^s   K0K3 3	L<LLc                 b   	 t        |       }t        |      }t        |      }t        |      }t	        |      }t        j                  d|  d|        t        |      }t        |      }t        |      }|st        d|        |||||||dS # t        $ r}	t        d|  d|	       d }	~	ww xY w)NzItem Details for order r"   rR   )rb   additonal_detailsr   r   r   r  r   r   )rV   rc   r   r   r   r{   r|   r  r   r   rE   r}   )
rN   
order_datarb   r   r   r   r  r   r   r   s
             r*   _serialize_order_datar    s    R-h7
2:>6zB0<)*5.xj<.IJ+J7+J7z*#&B8*$MNN "1!3!.!-!-!-!'
 	
  R">xjQC PQQRs   BB 	B.B))B.c                     t         j                  j                  d      sA	 t        j                  d       t        j                  d       t        j                  d       y t         j                  j                  d      s	 t        j                  d       t         j                  j                  d      s	 t        j                  d       y y # t        $ r} t               d } ~ ww xY w#  t               xY w#  t               xY w)Nz./media/outputz./media/output/excelz./media/output/pdf)rI   rJ   rK   mkdirr}   r>   )r   s    r*   _check_output_dirr    s    77>>*+	.HH%&HH+,HH)* ww~~452/0 ww~~232-. 4  	.+--	.2/112/11s/   ?C C( 6C7 	C%
C  C%(C47Dc                 >    	 t        |       }|S #  t        |       xY wrH   )r   rB   )rL   wbs     r*   _open_excelr    s(    7=)	7'66s    r  output_excelc                     | st        d      | j                  |d| dz          | j                          t        j                  d|        y )Nz?Workbook is not opened. Please open the workbook before saving./.xlsxzExcel file saved at )
ValueErrorsavecloser{   r|   )r  r  rN   s      r*   _save_excelr"    sH    Z[[GGLQxj../HHJLL'~67r+   	worksheetrowcolumnc           	      V   	 | j                  ||      }t        |t              rg }| j                  j                  D ]Y  }|j
                  |cxk  r|j                  k  s#n &|j                  |cxk  r|j                  k  sFn I|j                  |       [ |D ]  }| j                  t        |              | j                  ||      }||_        y# t        $ rJ}t        j                  d| d| d|        	 | j                  |||       n#  Y nxY wY d}~yY d}~yd}~ww xY w)z>Safely write to a cell, unmerging merged cells before writing.r$  r%  zError writing to cell (, z): )r$  r%  r   N)cell
isinstancer   merged_cellsrangesmin_rowmax_rowmin_colmax_colr   unmerge_cellsr0   r   r}   r{   r~   )r#  r$  r%  r   r)  ranges_to_unmergemerged_ranger   s           r*   _safe_write_cellr4    s   ~~#f~5dJ' " ) 6 6 = = ((CG<3G3GG$,,N,:N:NN%,,\: !>
 !2''L(9: !2 >>c&>9D
 /uBvhc!EF	NNs6N?	D @s=   AC  "C AC 	D(D#=DD#DD##D(rb   c                     t        j                  d|        |st        d      |j                  dd      }|j                  dd      }t	        | dd|       t	        | dd|       y )	NzInvoice Details: z7No invoice details provided to write to the excel file.r[   rZ   r\            )r{   r|   rE   rT   r4  )r#  rb   invoice_numberinvoice_dates       r*   _write_invoice_detailsr;    si    LL$_$567 YZZ$(()95AN$((5AL Y2~6Y2|4r+   r   c                    |st        d      |j                  dd      }t        j                  j                  |      j                  r4t        j                  j                  |      j                  j
                  nd}|j                  dd      }|j                  dd      }|j                  d|      }|j                  dd      }|j                  d	d      }t        | d
d|       t        | dd|       t        | dd|       t        | dd|       t        | dd|       t        | dd|       t        j                  d| d| d| d| d| d|        y )Nz:No additional details provided to write to the excel file.rl   rZ   rP   rm   rn   ro   rp   rq      r7  	   
            z%Written additional details: Order No=z, Slot=z	, Amount=z, Mode=z	, Source=z, Items=)	rE   rT   r   rS   ru   rv   r4  r{   r|   )	r#  r   order_nomoder   r   ru   r   r   s	            r*   _write_additional_detailsrE    sZ    \]]&**:UCHKQ>>K]K]goK]KpK}K}6>>x0==GG  DID&**6eDD'++,<eDN&**>TBL&**8eDF&**=eDK YB1YB-YB7YB5YB/YB4LL8
'$ P)*',yPXYdXeg hr+   r   
row_offsetc                 ,   |st        d      |j                  dd      }|j                  dd      }|j                  dd      }t        | d|z   d|       t        | d|z   d|       t        | d	|z   d|       t        j                  d
| d| d|        y )Nz5No other charges provided to write to the excel file.r   rh   r   r               z Written other charges: Delivery=z, Discount=z	, Coupon=)rE   rT   r4  r{   r|   )r#  r   rF  r   r   r   s         r*   _write_other_chargesrL    s     WXX$(();VD$((fEH$(();fE
 YZ5EFYZX>YZ5EFLL34D3E[QYPZZcdtcuvwr+   	total_rowrt   c                    t        d      }t        ||||      }d| d| }	 | j                  |       | j	                  |d      }d|_        t        d	
      |_        t        dd      |_	        ||_
        | j	                  |d      }d|d|_        t        d	
      |_        t        dd      |_	        ||_
        d| j                  |   _        y# t        $ r Y w xY w)zBWrite the grand-total summary row immediately after all item rows.thinstyle)topbottomleftrightEz:Or8  r'  r   T)boldrU  center)
horizontalverticalr7  rf   rg      N)r   r   merge_cellsr}   r)  r   r   fontr   	alignmentborderrow_dimensionsheight)r#  rM  rt   rO  full_borderlabel_range
label_cell
value_cells           r*   _write_row_totalrf  +  s    V$DT$TFK i[9+.Kk* &NNyNCJ#J dOJO%8LJ'J &NNyNDJ!+c!23J dOJO%HMJ'J13IY'.!  s   C 	C#"C#r   c           	      f   |st        d      d}t        |d      D ]  \  }}||z   dz
  }|j                  dd      }|j                  dd      }|j                  dd      }	|j                  d	d      }
|j                  d
d      }|j                  dd      }t        |j                  dd            }t        |j                  dd            }t        |j                  dd            }|j                  dd      }|j                  dd      }t	        | |d|       t	        | |d|       t	        | |d|       t	        | |d|	       t	        | |d|
       t	        | |d|       t	        | |dt        |      j                  d      sd| n|       t	        | |d| d       t	        | |d| d       t	        | |d| d       t	        | |d|       t	        | |d|       t        dd       D ](  }| j                  ||!      }t        d"d"d#$      |_
        *  |t        |      z   }t        | ||       y%)&u%  
    Write item rows using the updated template column layout:

    E(5)  = Sl No.
    F(6)  = Item Description
    G(7)  = SKU Code
    H(8)  = Quantity
    I(9)  = Unit Price*
    J(10) = Gross Value*          (Unit Price × Quantity)
    K(11) = Discount*             (discount_per_unit × Quantity)
    L(12) = CGST Rate(%) Amount
    M(13) = SGST/UTGST Rate(%) Amount
    N(14) = CESS Amount
    O(15) = Total Tax             ((Gross Value − Discount) × tax_rate)
    P(16) = TOTAL Value           (Gross Value − Discount + Total Tax)
    z4No item details provided to write to the excel file.r7  rk   )startr   rZ   r   r   r   r   r   z0.00r   r   r   r   r   r   r8        r=  r>  r?  r@  rf   rA  %rB     rI     r'  rX  TrY  rZ  	wrap_textN)rE   	enumeraterT   r   r4  r0   
startswithranger)  r   r^  lenrf  )r#  r   rt   	start_rowidxr   current_rowitem_descriptionhsn_coder   
unit_pricer   r   	cgst_rate	sgst_ratecess_amountr   r   colr)  rM  s                        r*   _write_item_detailsr~  G  s-   "  VWWI|155	T#o)88$6>88J>88J?88L?
88M?88J@ *?!EF	 *<!EF	 -#!FG88K@	88M?KS9K5EFKX>KX>KZ@K[AKSQY]MeMefkMls8*5Erz{K	{!_EK	{!_EK}A5FGKY?K[A B<C>>k#>>D&(XY]^DN  ; 6D C--IY	;7r+   r   c                 d   |st        d      |j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }d	dg}|j                  |       |r%|dk7  r |j                  |j	                  d
             |r|dk7  r|j                  |       |r|dk7  r|j                  |       |r|dvr|j                  d|        t        | ddd
j                  |             | j                  dd      }t        ddd      |_	        y )Nz4No shop details provided to write to the excel file.r   rZ   r   r   r   r   ri   zDetails of Supplierr   )rZ   ri   zGSTIN: r6  r8  r'  rT  rR  Trn  )
rE   rT   r   extendsplitr4  r   r)  r   r^  )	r#  r   	shop_namer   
shop_phone
shop_email
shop_gstinlinesr)  s	            r*   _write_shop_detailsr    s$    VWW##KE:I##NE:L##LE:J##LE:J##LB7J"B'E	LL-\''-.jE)Z jE)Z j3wzl+,Y1dii&67>>a>*D&5DQDNr+   r   c                     	 t        |       }t        t        | |z
  dz              }dt        |d      j                          }|dkD  r|dt        |d       dz  }|dz  }|S #  d| d	dcY S xY w)
Nr   zRupees en_IN)langr   z and z paisez onlyrg   )r   r   r   
capitalize)r   rupeespaisewordss       r*   _convert_to_wordsr    s    	*UUEFNc1239V':EEGHI19uYu7;<FCCE*s5))s   A"A% %	A0r   c                 N   |st        d      |j                  dd      }t        |      }d|z   }d|z   }t        | |dd|d       t        | |d|       |df|dffD ]+  \  }}| j	                  ||	      }	t        d
dd      |	_        - t        j                  d| d|        y )Nz5No total details provided to write to the excel file.r   r         rA  rf   rg   r'  rT  rX  Trn  zWritten totals: Amount=z, Words=)	rE   rT   r  r4  r)  r   r^  r{   r|   )
r#  r   rF  item_details_totaltextfig_rowwrd_rowr$  r}  r)  s
             r*   _write_totalsr    s     WXXGQ//0D :oG:oGYs3Ec2J-KLYT2r]WbM2S~~#c~2"fxSWX 3 LL*+=*>htfMNr+   r  c                    |st        d      |j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }ddg}|r/|j                         r|j                  |j                                |r>|j                         r.|j	                  |j                         j                  d	             |r/|j                         r|j                  |j                                |r/|j                         r|j                  |j                                t        | d
dd	j                  |             | j                  d
d      }t        ddd      |_
        t        j                  d| d|        y )Nz4No user details provided to write to the excel file.r   rZ   r   r   r  zBill to/Ship tori   r   r6  r>  r'  rT  rR  Trn  zWritten user details: r(  )rE   rT   r   r   r  r  r4  r   r)  r   r^  r{   r|   )r#  r  r  r  
user_phone
user_emailr  r)  s           r*   _write_user_detailsr    sI    VWW##KE:I##NE:L##LE:J##LE:J#EY__&Y__&'**,\'')//56j&&(Z%%'(j&&(Z%%'(Y1dii&67>>a>*D&5DQDNLL))BzlCDr+   wsrt  offsetc                    g }t        | j                  j                        D ]  }|j                  |k\  s| j                  j                  j	                  |       t        |j                  |z   |j                  |z   |j                  |j                        }|j                  |        |D ]  }| j                  t        |              y )N)r-  r.  r/  r0  )listr+  r,  r-  remover   r.  r/  r0  r   r\  r0   )r  rt  r  
new_rangescrnew_crrs          r*   _shift_merged_cellsr    s    J2??))*::"OO""))"-

V+

V+



	F f% + 
s1v r+   c                 B    t        | |d       | j                  |       y )Nrk   )ru  )r  insert_rows)r  r$  s     r*   _add_rowr    s    C#NNsNr+   from_rowto_rowc                    | j                   }t        t        d      t        d      t        d      t        d            }t        d|dz         D ]  }| j	                  ||      }| j	                  ||      }t        |t              s|j                  |_        |j                  r}t        |j                        |_
        t        |j                        |_        t        |j                        |_        t        |j                        |_        d|cxk  rdk  r
n n||_        t        |j                        |_        t        |j                         |_        
 d| j"                  |   _        y )	NrO  rP  )rS  rT  rU  rR  rk   r'  r8  r7  (   )
max_columnr   r   rr  r)  r*  r   r   	has_styler	   r]  fill
protectionr^  r_  comment	hyperlinkr`  ra  )r  r  r  r0  thin_borderr}  source_celltarget_cells           r*   	_copy_rowr    s+   G&! v	K Q!$gg(3g7gg&3g7+z2 + 1 1K  %)+*:*:%;K%)+*:*:%;K%)+*@*@%AK"%)+*?*?%@K!C~2~%0" $[%8%8 9 $[%:%: ;# %& (*Bf$r+   pdf_dirc                    	 t         j                  j                  | | d      }d}t        |      j	                         }t        |      j	                         }|j                  dd       |j                         st        d|       d| d| d}t         j                  j                         }t        j                         d	k(  rRt        j                  d
       d|d<   ||d<   t        j                  |d   d       t        j                  |d   d       	 t        j                   |ddt        j"                  |       t        j                  d       y # t$        $ r1}t        j&                  d|        t        t)        |            d }~ww xY w# t$        $ r+}t        j&                  d|        t        d|       d }~ww xY w)Nr  z*/var/www/.cache/.config/libreoffice/4/userT)parentsexist_okzInput file not found:zLlibreoffice --headless --norestore --nolockcheck --convert-to pdf --outdir 'z' ''r   zRunning as Root Userz/tmp/libreoffice-profile/XDG_RUNTIME_DIRHOME)r  i  z	/bin/bash)shell
executablestderrenvzPDF conversion successfulzError in PDF Conversion: zError converting excel to pdf: )rI   rJ   r   r   resolver  rK   r5   environr	   geteuidr{   r|   makedirschmod
subprocesscheck_outputSTDOUTr}   r~   r0   )	r  rN   r  output_filelibreoffice_home	file_pathcommandr  r   s	            r*   _convert_to_pdfr    s   "H77<<
%6HIG,446	=002dT2!$'<YK%HII**1#i[C 	 jjoo::<1LL/0%@C!"%5CKKK-.>HHS*+U3	-##t!((c LL45 	-MM5aS9:$SV,,	-  H7s;< #B1#!FGGHs6   DF =E 	F",FFF 	G
&GG
c                     t         j                  j                  ||  d      }t         j                  j                  |      st	        d|       t        j                  d|        y )Nr  z"Output excel file does not exist: zOutput excel file exists: )rI   rJ   r   rK   r8   r{   r|   )rN   r  r  s      r*   _check_ouptput_excel_existr  3  sT    '',,|z-?@K77>>+&'*L[M(Z[[LL-k];<r+   
output_pdfc                     t         j                  j                  ||  d      }t         j                  j                  |      st	        d|       t        j                  d|        y )Nz.pdfz Output pdf file does not exist: zOutput pdf file exists: )rI   rJ   r   rK   r   r{   r|   )rN   r  r  s      r*   _check_ouptput_pdf_existr  :  sT    '',,zhZt+<=K77>>+&$'G}%UVVLL+K=9:r+   rL   c                    t        j                  d       t        |       t                t	        |      }|d   }d|j
                  _        t        |       }t        j                  d|        |j                  di       }|j                  di       }|j                  di       }|j                  di       }|j                  d	i       }	|j                  d
i       }
t        ||       t        ||       t        ||	       t        ||       |j                  dg       }t        dt        |      dz
        }|dkD  r9t        dt        |            D ]!  }t!        |d|z          t#        |dd|z          # t%        |
j                  dd      xs d      }t'        |||       t)        |||       t+        ||
|       d}d}t-        |||        t/        | |       t1        || |       t3        | |       t        j                  d       y )NzExcel Writer ModuleSheet2FzData Details: rb   r  r   r   r  r   r   r   rk   r7  r   )rt   )rF  zmedia/output/excelzmedia/output/pdfz)Excel Writer Module Executed Successfully)r{   r|   rM   r  r  
sheet_viewshowGridLinesr  rT   r;  r  r  rE  maxrs  rr  r  r  r   r~  rL  r  r"  r  r  r  )rN   rL   r  r#  datarb   r   r   r   r  total_calculated_chargesr   rF  irt   r  r  s                    r*   template_writerr  A  s   LL&'-(M*B8I).I& *DLL>$()#xx(9R@O#xx(;R@#xxR@M#xxR@L#xxR@L#xxR@ 9o6	<0	<0i);< 88NB/Lq#l+a/0JA~q#l+,AYQ'iR!V, - 044Wa@EAFK	<[IMjI)5*M (L%GL(+x6L(G4Xw/LL<=r+   r@   )r   )r   )VrI   openpyxlr   openpyxl.stylesr   r   r   openpyxl.worksheet.worksheetr   openpyxl.workbookr   r	   openpyxl.utils.cellr
   r   openpyxl.worksheet.cell_ranger   openpyxl.cellr   orders.modelsr   r   r   r   r   r   products.modelsr   r   accounts.modelsr   shops.modelsr   r   r{   r  r   r   pathlibr   r   r}   r   r5   r8   r;   r>   rB   rE   rM   r0   rV   dictrc   r   r   django.db.modelsr   r  r   r   r   r  r  r  r  r"  r   r4  r;  rE  rL  r   rf  r~  r  r  r  r  r  r  r  r  r  r  r   r+   r*   <module>r     s   	 " ' ( 2 &  P 3 $ e e ) ! -   +  :Y :: ::	 ::I ::	 ::	 ::	 :3
  & T _V _ _@Z Z4 Z$ |
 |
D |
~& T V`v V`$ V`r'^v '^$ '^TRC RD R:2*7( 78H 8C 83 84 8	  S D 6
5i 
5$ 
54 
5h h hQU h0xI xd xPS x\` x$4	 4c 4 4RV 48989 98D 98u 98_c 98xR9 RD RT R4
*U 
*s 
*OY O O# Od O*E9 ED ET E4I # s t     
*) *s *C *D *>#H# #H #Hs #Ht #HL= =C =D =;s ; ; ;0>c 0># 0>$ 0>r+   