
    i                         d dl mZmZmZmZ d dlZd dl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 d dlmZ ed   Z ej$                  d      Z G d	 d
      Zy)    )dbusers_collectiontransactions_collectionproducts_collectionN)datetime	timedelta)	UserModel)
TopupModel)ObjectIdorderszAsia/Ho_Chi_Minhc                   Z   e Zd Zededefd       Zed        Zed        Zed        Zed        Z	ed        Z
ed	        Zed?dedefd       Zedefd       Zed        Zed        Zed?defd       Zed        Zed@d       Ze	 	 	 	 	 	 dAdededededededefd       Zededefd       Zedededefd       Zededefd       Zed edefd!       Zed"        Zed#efd$       Zed%ed&efd'       Ze	 	 	 	 	 	 dBdedededededefd(       Ze	 	 	 	 	 	 dCdeded)ed*ed+ed,efd-       Z e	 	 d@d.ed/ed0ed1efd2       Z!e	 	 d@d3ed/ed0ed1efd4       Z"e	 	 dDd3ed5ed6efd7       Z#ed3efd8       Z$ed3efd9       Z%edEd:       Z&edFd;       Z'ed@d<       Z(ed=edefd>       Z)y
)G
OrderModelorder_idid_khach_hangc                     |d| id| igdS )NorderIdid)r   $or )r   r   s     2/var/www/pod-logistic/pod-api/model/order_model.py_order_matchzOrderModel._order_match   s&     +H%x 
 	
    c                      ddddddS )N streetcitystatecountryzipCoder   r   r   r   _blank_addresszOrderModel._blank_address   s     
 	
r   c                 *   t        | t              rX| j                  dd      | j                  dd      | j                  dd      | j                  dd      | j                  dd      dS t        | t              r| dddddS t        j                         S )Nr   r   r   r   r   r    r   )
isinstancedictgetstrr   r!   )addresss    r   _normalize_addresszOrderModel._normalize_address%   s    gt$!++h3FB/ Wb1";;y"5";;y"5  gs#!  ((**r   c                    | j                  d      }t        |t              r|j                  dd      |j                  d| j                  dd            |j                  d| j                  dd            t        j	                  |j                  d| j                  di                   dS |xs | j                  dd      | j                  dd      | j                  dd      t        j	                  | j                  di             dS )	Ncustomernamer   phoneemailr'   r+   r,   r-   r'   customerName)r%   r#   r$   r   r(   )docr*   s     r   _normalize_customerzOrderModel._normalize_customer;   s    77:&h% VR0!gswww/CD!gswww/CD%88LLCGGIr,BC	  ; ;WWWb)WWWb)!44SWWY5KL	
 	
r   c                    t        | t              syd}| D ]  }t        |t              st        |j	                  dd      xs d      }t        |j	                  dd      xs d      }t        |j	                  dd      xs d      }t        |j	                  dd      xs d      }|||z  |z   |z   z  } t        |d      S )N        quantityr   priceshippingtax   )r#   listr$   floatr%   round)itemstotalitemr4   r5   r6   r7   s          r   _calculate_totalzOrderModel._calculate_totalP   s    %& 	7DdD)TXXj!49:H$((7A.3!4ETXXj!49:H*/a0CX%0366E	7 UAr   c                     | j                  d      }	 t        t        |      d      S # t        t        f$ r( t
        j                  | j                  dg             cY S w xY w)Nr=   r8   r<   )r%   r;   r:   	TypeError
ValueErrorr   r?   )r0   r=   s     r   _resolve_order_totalzOrderModel._resolve_order_totalb   sY     	Euq)):& 	E..swww/CDD	Es   ( 4AAc                     | sdddS | j                  dd       d| j                  dd       j                         }|xs | j                  dd      | j                  dd      dS )Nr   uploadedByNameuploadedByEmail	firstName lastNamer-   )r%   strip)user_doc	full_names     r   _build_uploader_info_from_userz)OrderModel._build_uploader_info_from_userj   sv    "$#% 
  ||K45Qx||JPR7S6TU[[]	 (D8<<+D'||GR8
 	
r   Nuser_idcachec                     t        | xs d      j                         } | sdddS |	| |v r||    S t        j                  |       }t        j                  |      }|||| <   |S )Nr   rE   )r&   rK   r	   get_user_by_idr   rN   )rO   rP   userinfos       r   _get_uploader_infozOrderModel._get_uploader_infoy   sy    gm$**,"$#% 
 E!1>!''088>!E'Nr   keywordc                    | xs dj                         }|sg S t               }t        j                  |      dd}t	        j
                  dd|id|id|igdd	d
i      }|D ]  }|j                  t        |d	                ! |j                         }d|v rt	        j
                  ddid
d
d
d
d      }|D ]  }|j                  dd       d|j                  dd       j                         j                         }t        |j                  dd            j                         }	||v s||	v sx|j                  t        |d	                 t        |      S )Nr   iz$regexz$optionsrS   r-   rH   rJ   )roler   _id   rI   rZ   )r[   rH   rJ   r-   )rK   setreescaper   findaddr&   lowerr%   r9   )
rV   cleaned_keywordmatched_idsregexdirect_matchesrS   lowered_keywordname_matchesrM   r-   s
             r   _find_uploader_ids_by_keywordz(OrderModel._find_uploader_ids_by_keyword   sq   "=b//1Ie99_53G)..e$ %(' AJ

 # 	.DOOCU,-	. *//1/!+00 q1EL
 % 6#xxR89488JPR;S:TU[[]cce	DHHWb1288:"i/?e3KOOCU$456 K  r   c                    | j                  d      }t        |t              r]g }t               }|D ]H  }t	        |xs d      j                         }|r||v r'|j                  |       |j                  |       J |r|S t	        | j                  d      xs | j                  d      xs d      j                         }|r|gS g S )NsourceOrderIdsr   r   r   )r%   r#   r9   r]   r&   rK   ra   append)r0   raw_idsresultseenrawvaluefallback_order_ids          r   _normalize_source_order_idsz&OrderModel._normalize_source_order_ids   s    ''*+gt$F5D %CI2,,.e$% 	 2 Icggdm IrJPPR%&&	r   c                 V    | j                  d      dk(  xr | j                  d      dk(  S )Nstatus	CancelledcancelledByrS   r%   )r0   s    r   _is_hidden_from_adminz OrderModel._is_hidden_from_admin   s)    wwx K/TCGGM4Jf4TTr   uploader_cachec                 d   | j                  d      xs! | j                  d      xs t        | d         }t        j                  |       }| j                  dd      }| j                  dd      }|s1|s/t        j	                  | j                  d      |      }|d   }|d   }| j                  dg       }t        |t              r|ng }t        |      }	t        j                  |       }
|t        | d         | j                  d	      xs( | j                  d
      r| j                  d
d      d d nd|j                  dd      | j                  d      xs | j                  dd      | j                  dd      | j                  dd      ||t        j                  |       | j                  dd      |	|
dS )Nr   r   r[   rF   r   rG   r   r<   date	createdAt
   r+   trackingtrackingNumbertrackingLinkru   Unpaidrw   )r   docIdr|   r*   r   r   ru   rF   rG   rk   rw   	itemCountr=   )
r%   r&   r   r1   rU   r#   r9   lenrC   rs   )r0   rz   r   r*   uploaded_by_nameuploaded_by_emailuploader_info	raw_itemsr<   
item_countr=   s              r   _sanitize_order_listzOrderModel._sanitize_order_list   s   779%II#c%j/11#677#3R8GG$5r:(9&99#''/:RTbcM,-=> -.? @GGGR(	'	48	bZ
//4 U_GGFOfQ\I]R(@"(Ece VR0
+Lsww7G/LGGNB7ggh1.0(DDSI77="5#
 	
r   c                 Z   | j                  d      xs! | j                  d      xs t        | d         }t        j                  |       }| j                  dg       }t	        |t
              r|ng }| j                  d      }	 t        |      }| j                  dd      | j                  dd      d	}|d   s)|d   s$t        j                  | j                  d
            }|t        | d         ||| j                  dd      t        |d      | j                  d      xs | j                  dd      | j                  dd      |d   |d   t        j                  |       | j                  dd      | j                  dd      dS # t        t        f$ r t        j                  |      }Y w xY w)Nr   r   r[   r<   r=   rF   r   rG   rE   r   ru   r   r8   r   r   r   rw   refundAmountr   )r   r   r*   r<   ru   r=   r   r   rF   rG   rk   rw   r   )r%   r&   r   r1   r#   r9   r:   rA   rB   r?   rU   r;   rs   )r0   r   r*   r   r<   r=   r   s          r   _sanitize_order_detailz!OrderModel._sanitize_order_detail   s   779%II#c%j/11#6GGGR(	'	48	b 	7%LE
 "gg&6;"ww'8"=

 -.}EV7W&99#''/:RSM  U_ ggh15!_
+Lsww7G/LGGNB7+,<=,->?(DDSI77="5GGNA6
 	
 :& 	7//6E	7s   F $F*)F*c                     | s|sy i }i }| r| |d<   |  d|d<   |r||d<   | d|d<   g }|r|j                  d|i       |r|j                  d|i       |sy d|iS )N$gtez	T00:00:00$ltezT23:59:59.999999r|   r}   r   )rl   )	date_fromdate_todate_conditioncreated_at_conditionor_conditionss        r   _build_date_filterzOrderModel._build_date_filter  s    !%.N6".7[	+B (%,N6".5Y6F+G (  &.!9:  +/C!DE}%%r   ru   dateFromdateTopage	page_sizec           	         | st        d      t        |d      }t        |d      }d| ig}|r'|dd}|j                  dd|id|id	|id
|id|igi       |r|dk7  r|j                  d|i       t        j	                  ||      }	|	r|j                  |	       t        |      dk(  r|d   nd|i}
t        j                  |
      }|dkD  rt        j                  ||z        nd}|dz
  |z  }t        j                  |
      j                  ddg      j                  |      j                  |      }|D cg c]  }t        j                  |       }}|||||dS c c}w )NMissing id_khach_hangr\   r   rX   rY   r   r   r   r   customer.namer*   Allru   r   $andr}   r|   r   datar=   r   pageSize
totalPages)rB   maxrl   r   r   r   orders_collectioncount_documentsmathceilr`   sortskiplimitr   )r   rV   ru   r   r   r   r   
conditionsre   date_filterquerytotal_itemstotal_pagesr   cursorr0   r   s                    r   get_all_orderszOrderModel.get_all_orders7  s    4554|	1%	&67
&C8E"E*u#U+(%0#U+
 fox01 33HfEk*!$ZA!5
1FJ;O'77><G!Odiii 78QRqI% ""5)T$l34T$ZU9	 	 CII3*11#6II  !%
 	
 Js   2Ec                     t         j                  t        j                  | |            }|st	        d      t        j                  |      S NOrder not found)r   find_oner   r   rB   r   )r   r   orders      r   get_order_detailzOrderModel.get_order_detailu  s?    !**:+B+B8]+[\.//0077r   update_datac                    t         j                  t        j                  | |            }|st	        d      |j                  d      dvrt	        d      i }d|v rt        j                  |      }|j                  d      xs i }|j                  d|d         |j                  d|d         |j                  d|d         i |d	   |j                  d	      xs i d
}||d<   d|v r#|d   |d<   t        j                  |d         |d<   |r,t         j                  t        j                  | |      d|i       t         j                  t        j                  | |            }t        j                  |      S )Nr   ru   r   
Processingz/Only Unpaid or Processing orders can be updatedr*   r+   r,   r-   r'   r.   r<   r=   $set)
r   r   r   r   rB   r%   r1   r?   
update_oner   )	r   r   r   r   payloadcurrent_customerincoming_customermerged_customerupdated_orders	            r   update_orderzOrderModel.update_order|  s   !**:+B+B8]+[\.//99X&>>NOO$)==eD +
 ; Ar *--f6Fv6NO*..w8H8QR*..w8H8QR&y1(,,Y7=2	O #2GJk!*73GG)::;w;OPGG((''-@!
 *22:3J3J8Ub3cd00??r   c           	      R   t         j                  t        j                  | |            }|st	        d      |j                  d      }|dvrt	        d      t         j                  t        j                  | |      ddd|t        j                         j                         di       y	)
Nr   ru   r   z1Only Unpaid or Processing orders can be cancelledr   rv   rS   )ru   rw   cancelledByUserIdcancelledAtT)
r   r   r   r   rB   r%   r   r   utcnow	isoformat)r   r   r   current_statuss       r   cancel_orderzOrderModel.cancel_order  s    !**:+B+B8]+[\.//8,!99PQQ$$##Hm<)#))6#+??#4#>#>#@	
	
 r   	order_idsc                    |st        d      |ddd| iidd| iigd}t        t        j                  |            }|st        d      t	        j
                  |      }|st        d      t        t        d	 |D              d
      }|dk  rt        d      t	        j                  ||       g }d}	 |D ]  }|j                  d      xs |j                  d      }	t        j                  |j                  dg             }
t        j                  |d   dddddii      }|j                  dk(  s||j                  |	       ||
z  } 	 t        |d
      }|s!t	        j                   ||       t        d      t        ||z
  d
      }|dkD  rt	        j                   ||       |j                  dd       d|j                  dd       j%                         xs |j                  dd      xs d}	 t'        j(                  ||||       t-        |      |dS # t        $ rF}t        ||z
  d
      }|dkD  rt	        j                   ||       t        dt#        |             d }~ww xY w# t        $ r}t+        d|        Y d }~|d }~ww xY w) Nr   r   r   $inr   )r   ru   r   z"No unpaid orders found for paymentzUser not foundc              3   f   K   | ])  }t         j                  |j                  d g              + yw)r<   N)r   r?   r%   ).0r0   s     r   	<genexpr>z(OrderModel.pay_orders.<locals>.<genexpr>  s&     \c
++CGGGR,@A\s   /1r8   r   u=   Không tìm thấy tổng tiền hợp lệ để thanh toánr3   r<   r[   r[   ru   r   ru   r   r\   u   Thanh toán thất bại: u=   Thanh toán thất bại. Số dư đã được hoàn lại.rH   r   rI   rJ   r-   Unknown User)r   ten_khach_hangamountr   u!   Lỗi ghi transaction deduction: )	paidCounttotalAmount)rB   r9   r   r`   r	   rR   r;   sumdeduct_balancer%   r   r?   r   modified_countrl   	Exceptionadd_balancer&   rK   r
   create_deduction_transactionprintr   )r   r   
base_querymatched_ordersrS   potential_totalpaid_orders
paid_totalr0   order_identifierorder_totalrn   erefund_amountr   s                  r   
pay_orderszOrderModel.pay_orders  s   455 +UI./y)*

 /44Z@AABB''6-..\^\\

 a\]]  @
	D% .#&779#5#F (99#'''2:NO*55J(;h56
 ((A-&&'78+-J.$ :q)
!!-A\]]o
:A>1!!-? xxR()488J+C*DEKKM xx$ 		;33+-!%	 [)%
 	
A  	D!/J">BMq %%m]C9#a&BCC		D:  	;5aS9::	;s8   2A=H 0H 0I) 	I& AI!!I&)	J
2JJ
c                  0    dddg diidddiddd	iigigigS )
Nr   ru   r   r   PrintingShippedr   rv   rw   $nerS   r   r   r   r   _admin_base_conditionsz!OrderModel._admin_base_conditions  sJ     'LMN%{3*UFO<!

 	
r   r   c                 .    ddd}|j                  |       S )Nr   r   r   r   rx   )r   flows     r   _allowed_next_statuszOrderModel._allowed_next_status!  s"     %!
 xx''r   	order_docr   c                 ~   dt        j                         j                  d d j                          }t	        j
                  t              }t        | j                  d      xs$ | j                  d      xs | j                  d            }t        j                  | j                  d            }d}|rM|j                  dd	       d
|j                  dd	       j                         xs |j                  dd	      xs d}||dd|d|dd| d|dd | j                  dd	      |d}t        j                  |       |S )NzTX-   r   r   r[   r   r   rH   r   rI   rJ   r-   Depositz+$z,.2f	Completedu   Hoàn tiền đơn hàng u    (admin huỷ)Balance Refund)r   r|   typer   numericAmountru   	reasonKeyreferenceIdpaymentMethod
receiptUrlr   r   )uuiduuid4hexupperr   nowVN_TZr&   r%   r	   rR   rK   r   
insert_one)r   r   tx_idnow_vn	order_refcustomer_docr   new_docs           r    _create_admin_refund_transactionz+OrderModel._create_admin_refund_transaction)  s?   djjl&&r*00234e$	i0_IMM$4G_9==Y^K_`	 //	o0NO'##K45Q|7G7G
TV7W6XY__a "##GR0"!  6$-(#!4YK~N$-&]]?B?,
 	 **73r   c           	         t        |d      }t        |d      }t        j                         }| rt        j                  | j                               }|dd}t        j                  |       }	d|id|id|id|id|id	|id
|id|ig}
|	r|
j                  dd|	ii       |j                  d|
i       g d}|r>|dk7  r9||vrg d||ddS |j                  d|i       |dk(  r|j                  dddii       t        j                  ||      }|r|j                  |       t        |      dk(  r|d   nd|i}t        j                  |      }|dkD  rt        j                  ||z        nd}|dz
  |z  }t        j                  |      j                  ddg      j!                  |      j#                  |      }i }|D cg c]  }t        j%                  ||       }}|||||dS c c}w )Nr\   rX   rY   r   r   r   r   r   r*   rF   rG   r   r   r   )r   r   r   rv   r   r   r   ru   rv   rw   r   rS   r   r   r   )r   r   r   r^   r_   rK   ri   rl   r   r   r   r   r   r   r`   r   r   r   r   )rV   ru   r   r   r   r   r   escaped_keywordre   matched_uploader_idskeyword_conditionsallowed_admin_statusesr   r   r   r   r   r   rz   r0   r   s                        r   admin_get_all_orderszOrderModel.admin_get_all_ordersJ  s3    4|	1%	668
 ii8O.C@E#-#K#KG#T  E"uU#!5) %(U#!5)"E*	" $"))?UDX<Y*Z[u&89:!Sfo33  )"#  x01$!!=5&/"BC 33HfEk*!$ZA!5
1FJ;O'77><G!Odiii 78QRqI% ""5)T$l34T$ZU9	 	 RXY3*11#~FYY  !%
 	
 Zs   :G!	salesPagesalesPageSizesalesSortBysalesSortOrderc                    t        dt        |            }t        dt        dt        |                  }t        |xs d      j	                         }t        |xs d      j	                         j                         }|dvrd}|dvrd}t        j                  | |      }ddg d	iig}ddg d	iig}|r"|j                  |       |j                  |       t        |      dk(  r|d
   nd|i}	t        |      dk(  r|d
   nd|i}
d}i }i }t        j                  |	ddd      }|D ]J  }|t        j                  |      z  }|j                  dg       }t        |t              s?|D ]  }t        |t               st        j#                  |j                  d      d
      }|d
k  r@t        j%                  |j                  d      d
      }t        j%                  |j                  d      d
      }t        j%                  |j                  d      d
      }t'        ||z   |z   |z  d      }t        j)                  ||      }||vr	|d
dd||<   ||   dxx   |z  cc<   ||   dxx   |z  cc<   	 M g }|j+                         D ]3  }|j                  |d   t        |d         t'        |d   d      d       5 |dk(  r|j-                  d |dk(         n|j-                  d |dk(         t        |      }|d
kD  rt/        j0                  ||z        nd}|dz
  |z  }||z   }||| }t3        d |D              }t'        t3        d |D              d      } t        j5                  |
      }!ddddid }"t        j7                  | |      }#|#r|#|"d!<   d}$t9        j                  |"d"di      }%|%D ]*  }&|$t        j%                  |&j                  d"      d
      z  }$, t'        |d      t        |!      t'        |$d      ||||||| ||d#S )$Nr\   d   revenuedesc)r  qtySold)ascr  ru   r   r   r   r   r3   )r<   r=   r<   r4   r5   r6   r7   r8   )r+   r  r  r  r+   c                 :    | d   | d   | d   j                         fS )Nr  r  r+   rb   xs    r   <lambda>z8OrderModel.admin_get_dashboard_summary.<locals>.<lambda>       q|Qy\1V9??;LM r   )keyreversec                 :    | d   | d   | d   j                         fS )Nr  r  r+   r!  r"  s    r   r$  z8OrderModel.admin_get_dashboard_summary.<locals>.<lambda>  r%  r   c              3   &   K   | ]	  }|d      yw)r  Nr   r   rows     r   r   z9OrderModel.admin_get_dashboard_summary.<locals>.<genexpr>  s     Cc)nC   c              3   &   K   | ]	  }|d      yw)r  Nr   r*  s     r   r   z9OrderModel.admin_get_dashboard_summary.<locals>.<genexpr>  s     'M3I'Mr,  r   Approvedr   r   )r   ru   r  r|   r   )totalRevenuetotalOrders
totalTopupsalesByProductr  r  
salesTotalsalesTotalPagessalesGrandQtysalesGrandRevenuer  r  )r   intminr&   rK   rb   r   r   rl   r   r   r`   rC   r%   r#   r9   r$   	_safe_int_safe_numberr;   _resolve_sales_product_namevaluesr   r   r   r   r   _build_transaction_date_filterr   )'r   r   r  r  r  r  order_date_filterpaid_conditionsactive_order_conditions
paid_queryactive_order_querytotal_revenue	sales_mapproduct_name_cacher   r0   r<   r>   r4   r5   r6   r7   line_revenueproduct_name
sales_rowsr+  sales_totalsales_total_pagesstartendpaged_salessales_grand_qtysales_grand_revenuetotal_orderstopup_querytransaction_date_filtertotal_topup	tx_cursortxs'                                          r   admin_get_dashboard_summaryz&OrderModel.admin_get_dashboard_summary  s    3y>*	As3M(:;<+2399;^5v6<<>DDF44#K0#N&99(FK$u.S&TUV$,u6[.\#]"^""#45#**+<=+.+?1+D_Q'6SbJc
 *+q0 $A&12 	 	"''
   	CCZ<<SAAMGGGR(EeT* C!$-%//0DaHq="//0A1E%22488J3GK --dhhuoqA  %eh&6&<%H!L)EEdL^_y0 ,#$#&/Il+ ,'	2h>2,'	2lB23C 	CD 
##% 	CFs9~. Y3 	 )#OOM'61  
 OOM'61  
 *oFQTUoDIIkM&AB[\Q-/m# s+C
CC#C'M*'M$MqQ(889KL  #%56
 #-"K"KHV\"]""9K+00PQ>RS	 	OB:22266/3JANNK	O "-3|,Q/)"*%0,!4&,
 	
r   doc_ids
new_statustracking_numbertracking_linkc                 >   | st        d      g }t               }| D ]R  }t        |xs d      j                         }|r||v r'	 |j	                  t        |             |j                  |       T |st        d      t        t        j                  dd|ii            }t        |      t        |      k7  rt        d      |dk(  rt        |      d	k7  rt        d
      |D ][  }	|	j                  dd      }
|
dv rt        d      t        j                  |
      }|st        d      ||k7  sLt        d|
 d|        d|i}|dk(  rs|r|j                         st        d      |r|j                         st        d      |j                         |d<   |j                         |d<   |j                         |d<   t        j                  dd|iid|i      }|j                   ||D cg c]  }t        |       c}dS # t        $ r t        d|       w xY wc c}w )NzNo orders selectedr   zInvalid docId: zNo valid orders selectedr[   r   zOne or more orders not foundr   r\   z)Shipped can only update 1 order at a timeru   r   rv   zBOne or more selected orders are not available for admin operationsz4One or more selected orders can no longer be updatedInvalid status transition:  -> 2trackingNumber is required when confirming shipped0trackingLink is required when confirming shippedr   r   r   r   )updatedCountru   docIds)rB   r]   r&   rK   rl   r   ra   r   r9   r   r`   r   r%   r   r   update_manyr   )rW  rX  rY  rZ  unique_doc_idsro   raw_iddoc_idr   r   r   allowed_nextr   rn   r#  s                  r   admin_batch_update_order_statusz*OrderModel.admin_batch_update_order_status(  sV    122u 		=F2&,,.FVt^=%%hv&67 		= 788',,ee^5L-MNOv;#n--;<<"s>':a'?HII 	aE"YYx4N!88 !eff%::>JL !WXX\) #>~>NdS]R^!_``	a Z(""/*?*?*A !UVV (;(;(= !STT"1"7"7"9GJ(7(=(=(?G$%&3&9&9&;GN#"..UN+,W
 #11 '56!s1v6
 	
W  = ?6(!;<<=\ 7s   +G?(H?H
identifierc                    t         j                  t        j                  |             }|rt        j	                  |      rt        d      |j                  dd      }|dv rt        d      t        j                  |      }|st        d      ||k7  rt        d| d|       d|i}|d	k(  rs|r|j                         st        d
      |r|j                         st        d      |j                         |d<   |j                         |d<   |j                         |d<   t         j                  d|d   id|i       t         j                  d|d   i      }t        j                  |      S )Nr   ru   r   r\  z0This order is not available for admin operationsz#This order can no longer be updatedr]  r^  r   r_  r`  r   r   r   r[   r   )r   r   r   _admin_order_matchry   rB   r%   r   rK   r   r   )	ri  rX  rY  rZ  r   r   rg  r   r   s	            r   admin_update_order_statusz$OrderModel.admin_update_order_statusn  so    "**:+H+H+TU
88?.//8R044OPP!66~FBCC%:>:J$zl[\\Z(""/*?*?*A !UVV (;(;(= !STT"1"7"7"9GJ(7(=(=(?G$%&3&9&9&;GN#$$E%L!W	

 *22E5<3HI00??r   admin_id
admin_namec           
         t         j                  t        j                  |             }|rt        j	                  |      rt        d      |j                  dd      }|dvrt        d      t        |j                  d      xs d      j                         }|st        d      t        j                  |      }|dk  rt        d	      t        j                         j                         }t         j                  |d
   dddgidddd|xs d|xs d|di      }|j                  dk7  rt        d      d}	d }
	 t        j                   ||      }|st        d      d}	t        j#                  ||      }
t         j                  d
|d
   id||
t        j                         j                         di       t         j                  d
|d
   i      }t        j%                  |      ||
dS # t&        $ r}d|iddddddddd}t         j                  d
|d
   i|       |	r'	 t        j(                  ||       n# t&        $ r Y nw xY w|
r(	 t+        j,                  d|
i       n# t&        $ r Y nw xY wt        dt        |             d }~ww xY w)Nr   ru   r   r   z<Only Processing or Printing orders can be cancelled by adminr   zMissing customer id for refundr   zInvalid refund amountr[   r   r   r   r   r   rv   admin)ru   rw   cancelledByAdminIdcancelledByAdminNamer   r\   zOrder could not be cancelledFz)Refund failed while updating user balanceT)r   
refundTxId
refundedAt)r   r   rs  )rw   rq  rr  r   r   rs  rt  )r   z$unsetr   zAdmin cancel refund failed: )r   r   r   rk  ry   rB   r%   r&   rK   rC   r   r   r   r   r   r	   r   r  r   r   r   r   
delete_one)ri  rm  rn  r   r   rO   r   cancelled_atupdate_resultbalance_refundedrefund_tx_id	refund_okr   r   rollback_updates                  r   admin_cancel_orderzOrderModel.admin_cancel_order  s    "**:+H+H+TU
88?.//8R0!;;[\\eii06B7==?=>>"77>A455(224)44%LU\:4N,OP)#**2.b,6,<"#/
 ''1,;<< 8	F!--g}EI !LMM#%FFum\L((e%(5&2&.oo&7&A&A&C	 .66uU|7LMM#::=I -*   	F n $&*,,.#%$&"$"$	O ((%u)>P,,WmD   +66l7KL   ;CF8DEE=	Fsa   ;B.G* *	J3,J H76J7	I JIJ	I! J!	I-*J,I--JJc                     t         j                  t        j                  |             }|rt        j	                  |      rt        d      t        j                  |      S r   )r   r   r   rk  ry   rB   r   )ri  r   s     r   admin_get_order_detailz!OrderModel.admin_get_order_detail  sJ    !**:+H+H+TU
88?.//0077r   c                 z    d| id| ig}	 |j                  ddt        |       i       d|iS # t        $ r Y d|iS w xY w)Nr   r   r   r[   r   )insertr   r   )ri  r   s     r   rk  zOrderModel._admin_order_match	  sf     
#:


	a%*)=!>? z""  	z""	s   + 	::c                 b    	 t        | xs d      S # t        t        f$ r t        |      cY S w xY wNr   )r:   rA   rB   rq   defaults     r   r:  zOrderModel._safe_number  s4    	"!$$:& 	">!	"s    ..c                 t    	 t        t        | xs d            S # t        t        f$ r t        |      cY S w xY wr  )r7  r:   rA   rB   r  s     r   r9  zOrderModel._safe_int  s9    	 uUZa()):& 	 w<	 s    77c                     | s|sy i }| r,t         j                  t        j                  | d            |d<   |r:t         j                  t        j                  |d      t	        dd      z         |d<   |xs d S )Nz%Y-%m-%dr   r\   r   )dayssecondsr   )r  localizer   strptimer   )r   r   
date_querys      r   r=  z)OrderModel._build_transaction_date_filter%  sr    
!&0A0A)Z0X!YJv!&!!':6SU9VV"Jv !T!r   r>   c                    t        | j                  d      xs( | j                  d      xs | j                  d      xs d      j                         }|r|S t        | j                  d      xs d      j                         }|sy||vrMt        j                  d|iddi      }t        |xs i j                  d      xs |      j                         ||<   ||   S )NproductNametitler+   r   	productIdzUnknown Productr\   )r&   r%   rK   r   r   )r>   rP   direct_name
product_idr0   s        r   r;  z&OrderModel._resolve_sales_product_name4  s    HH]#Rtxx'8RDHHV<LRPR

%' 	 +.4"5;;=
$U"%..Z/H7TU,WC #SYBOOG$<$J
 K Q Q SE*Z  r   )N)NN)NNNNr\      )NNNNr\   r~   )NNr\      r  r  )r   r   )r3   )r   )*__name__
__module____qualname__staticmethodr&   r   r!   r(   r1   r?   rC   rN   r$   rU   ri   rs   ry   r   r   r   r7  r   r   r   r   r9   r   r   r   r:   r  r  rV  rh  rl  r|  r~  rk  r:  r9  r=  r;  r   r   r   r   r      s   
s 
3 
 
 
 
 + +* 
 
(  " E E 
 
 C   & %!s %! %!N  . U U  
$  
  
D #
 #
J & &8  ;
;
;
 ;
 	;

 ;
 ;
 ;
 ;
z 83 8s 8 8 %@s %@3 %@T %@ %@N s 3  . R
d R
3 R
 R
h 
 
 (S ( ( D %  @ M
M
M
 M
 	M

 M
 M
 M
\ $$M
M
M
 M
 	M

 M
 M
 M
\   $!	C
C
C
 C
 	C
 C
J   $!	)@)@)@ )@ 	)@ )@V  dFdFdF dF dFL 83 8 8 #s # # " "     " " !$ !t ! !r   r   )MongoDBConnectionr   r   r   r   r   r^   r  pytzr   r   model.user_modelr	   model.topup_modelr
   bsonr   r   timezoner  r   r   r   r   <module>r     sJ    ` `  	   ( & ( xL ()t! t!r   