
    gin2                         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mZ d dlmZ ed   Z G d d	e      Z G d
 de      Z G d de      Z G d de      Z G d d      Zy)    N)datetime)	BaseModel)ObjectId)dbusers_collection)
MailHelperordersc                   6    e Zd ZU eed<   eed<   eed<   eed<   y)UserGoogleLoginPayloademail	firstNamelastName	avatarUrlN__name__
__module____qualname__str__annotations__     1/var/www/pod-logistic/pod-api/model/user_model.pyr   r      s    JNMNr   r   c                   "    e Zd ZU eed<   eed<   y)UserLoginPayloadr   passwordNr   r   r   r   r   r      s    JMr   r   c                       e Zd ZU eed<   y)UserForgotPasswordPayloadr   Nr   r   r   r   r   r      s    Jr   r   c                   "    e Zd ZU eed<   eed<   y)UserUpdatePasswordPayloadr   newPasswordNr   r   r   r   r   r   "   s    Jr   r   c                   t   e Zd Zedefd       Zedefd       Zedd       Zed        Zed        Z	ed        Z
ed	        Zedd       Zed        Zed        Ze	 	 	 	 	 	 	 d d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fd       Zedefd       Zed        Zed        Zed        Zy
)!	UserModelr   c                 2    t        j                  | dd      S )Nuserr   role)r   find_one)r   s    r   get_user_by_emailzUserModel.get_user_by_email)   s    ((5&)IJJr   user_idc                 d    	 t        j                  t        |       dd      S # t        $ r Y y w xY w)Nr$   _idr&   )r   r'   r   	Exception)r)   s    r   get_user_by_idzUserModel.get_user_by_id-   s5    	#,,Xg5FPV-WXX 		s    # 	//c                 b    	 t        | xs d      S # t        t        f$ r t        |      cY S w xY w)Nr   )float	TypeError
ValueError)valuedefaults     r   _safe_floatzUserModel._safe_float4   s4    	"!$$:& 	">!	"s    ..c                    t        | t              syd}| D ]  }t        |t              st        j	                  |j                  d            }t        j	                  |j                  d            }t        j	                  |j                  d            }t        j	                  |j                  d            }|||z  |z   |z   z  } t        |d      S )N        quantitypriceshippingtax   )
isinstancelistdictr"   r5   getround)itemstotalitemr8   r9   r:   r;   s          r   _calculate_order_totalz UserModel._calculate_order_total;   s    %& 		7DdD) ,,TXXj-ABH))$((7*;<E ,,TXXj-ABH''8C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)NrC   r<   rB   )r@   rA   r0   r1   r2   r"   rE   )	order_docrC   s     r   _resolve_order_totalzUserModel._resolve_order_totalN   sY    g&	Puq)):& 	P33IMM'24NOO	Ps   ( 4AAc                      t        j                         } | j                  }| j                  }|dd|dd}t	        j
                  ||      d   }|dd|dd|d}||fS )N04d-02dz-01   )r   utcnowyearmonthcalendar
monthrange)nowrO   rP   startend_dayends         r   _current_month_rangezUserModel._current_month_rangeV   ss    ooxx		*AeC[,%%dE215c
!E#;a}5czr   c                     t        | j                  d      xs d      j                         }|r|d d S t        | j                  d      xs d      j                         }t        |      dk\  r|d d S |S )N	createdAt 
   date)r   r@   striplen)rG   
created_at
date_values      r   _order_date_keyzUserModel._order_date_key`   sq    {39r:@@B
cr?"v.4"5;;=
z?b cr?"r   Nc                     |xs dj                         }|xs dj                         }|s|st        j                         \  }}t        j                  |       }|sy|r||k  ry|r||kD  ryy)NrZ   FT)r]   r"   rW   ra   )rG   	date_fromdate_toperiod_from	period_to
order_dates         r   _is_in_periodzUserModel._is_in_periodl   sq     B--/]))+	9%.%C%C%E"K..y9
:3i/r   c                     t        | j                  d      xs d      j                         dk(  xr/ t        | j                  d      xs d      j                         dk(  S )NstatusrZ   	CancelledcancelledByadminr   r@   r]   )rG   s    r   _is_admin_cancelledzUserModel._is_admin_cancelled   sW     	h'-2.446+E KIMM-06B7==?7J	
r   c                 b    t        | j                  d      xs d      j                         }|dv S )Nrj   rZ   )
ProcessingPrintingShippedrn   )rG   rj   s     r   _is_paid_like_orderzUserModel._is_paid_like_order   s/    Y]]8,2399;>>>r   keywordpage	page_sizerc   rd   sort_by
sort_orderc                 $	   t        dt        |            }t        dt        dt        |                  }ddi}| xs dj                         } | r:t	        j
                  |       }|dd}	d|	id	|	id
|	id|	id|	id|	id|	id|	id|	ig	|d<   t        t        j                  |            }
t        |
      }|
D cg c].  }|j                  d      st        |j                  d            0 }}|D ci c]	  }|dddd }}|rt        j                  dd|iidddddddd      }|D ]  }t        |j                  d      xs d      j                         }|r||vr6t        j                  |      rLt        j                  |      }t        j!                  |      }t        j#                  |||      }|r||   dxx   |z  cc<   |s||   dxx   dz  cc<   |s||   dxx   |z  cc<    g }|
D ]  }t        |j                  d            }|j                  |dddd      }|j                  d	d      xs dj                         }|j                  d
d      xs dj                         }| d| j                         }t        j%                  |j                  dd            }t'        t        j%                  |j                  dd            d      }t        |j                  dd      xs d      }t'        t        j%                  |j                  dd            d      }|j)                  i d|d |xs |j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d!t'        |d      d|d|d|d"|d#|d$|        t        |xs d%      j+                         d&k7  }t        |xs d"      j+                         d"k(  r|j-                  d' |(       n|j-                  d) |(       |dkD  r||z   dz
  |z  nd} |dz
  |z  }!||!|!|z    }"|"|||| d*S c c}w c c}w )+NrM   d   r&   r$   rZ   i)z$regexz$optionsr   r   r   phoneaddresscitystatecountryzipCodez$orr,   r7   r   )
totalSpentperiodOrderCountperiodSpentid_khach_hangz$in)r   rj   rl   rC   rB   r\   rY   r   r   r    balancer<   idnametotalBalancespentmonthOrderCount
monthSpentdescascc                     t         j                  | j                  dd            t         j                  | j                  dd            t        | j                  dd            j	                         fS )Nr   r   r   r   rZ   r"   r5   r@   r   lowerxs    r   <lambda>z(UserModel.search_users.<locals>.<lambda>  sW    ))!%%a*@A))!%%*BCfb)*002 r   )keyreversec                     t         j                  | j                  dd            t         j                  | j                  dd            t        | j                  dd            j	                         fS )Nr   r   r   r   rZ   r   r   s    r   r   z(UserModel.search_users.<locals>.<lambda>  sW    ))!%%*BC))!%%a*@Afb)*002 r   )rB   rC   rv   pageSize
totalPages)maxintminr]   reescaper>   r   findr^   r@   r   orders_collectionr"   ro   rH   rt   rh   r5   rA   appendr   sort)#ru   rv   rw   rc   rd   rx   ry   queryescaped_keywordregexusersrC   r$   user_idsr)   	stats_maporder_cursorordercustomer_idorder_totalis_paid_likeis_in_periodrB   stats
first_name	last_name	full_nametotal_balancetotal_spentperiod_order_countperiod_spentr   total_pagesskippaged_itemss#                                      r   search_userszUserModel.search_users   so    1c$i 3sC	N34	 =b'') ii0O.C@E % e$U#% E"% E"E"
E%L %**512E
5:NTdhhuoC(NN $
  !$%" 
	 
 ,11 5("34%&#$!"L & M!%))O"<"BCIIK"k&B 007'<<UC(<<UC(66uiQ  k*<8KG8  k*+=>!C> $!+.}=L=/M2  +	D$((5/*GMM"%()#&E ((;39r@@BJ*b17R>>@I%,a	{399;I%11$((9a2HIM	 5 5eiia6P QSTUK!$UYY/A1%E%J!K !6!6uyyPQ7R!SUVWLLL'I>'2)> TXXgr2 TXXgr2	
 txx	26 DHHVR0 TXXgr2 txx	26 txx	26 #E-$; !+ '(: "<$ [%& &'9'( !,))+	Z j*F+113u<w!'"((*g5JJ
     JJ
     ?Daiuy(1,:QqI%D$"23 !!%
 	
q O
s   6RR/Ramountc                 ~    t        j                  t        |       ddddt        |      ii      }|j                  dkD  S )Nr$   r+   $incr   r   )r   
update_oner   r0   modified_count)r)   r   results      r   add_balancezUserModel.add_balance/  sC    !,,W%v6iv/0
 $$q((r   c                    t        |      }|dk  rt        d      t        j                  |       }|st        d      t        |j	                  dd      xs d      }||k  rt        d|dd|d      t        j                  t        |       dd	|id
dd| ii      }|j                  dk(  rt        d      t        ||z
  d      S )Nr   u#   Số tiền trừ không hợp lệu   Không tìm thấy userr   u#   Số dư không đủ. Hiện có $z.2fu	   , cần $r$   z$gte)r,   r&   r   r   u2   Không thể trừ số dư, vui lòng thử lạir<   )
r0   r2   r"   r.   r@   r   r   r   r   rA   )r)   r   r$   current_balancer   s        r   deduct_balancezUserModel.deduct_balance7  s    vQ;BCC''0677A 6 ;!<V#B?SVBWW`aghk`lmnn!,,W%v66BRSi&)*

   A%QRR_v-q11r   payloadc           
      2   t         j                  | j                        }|sut        t	        j
                               | j                  | j                  | j                  | j                  ddddd	}t        j                  |      }|j                  |d<   |}|S )Nr   googlerZ   r$   )	userIdr   r   r   r   r   auth_providerr   r&   r,   )r"   r(   r   r   uuiduuid4r   r   r   r   
insert_oneinserted_id)r   r$   new_userinsert_results       r   handle_google_loginzUserModel.handle_google_loginP  s    **7==9djjl+ $..#,,$..!)
H -77AM+77HUODr   c                 ^    t         j                  |       }|r|j                  d      |k(  r|S y )Nr   )r"   r(   r@   )r   r   r$   s      r   verify_loginzUserModel.verify_logind  s-    **51DHHZ(H4Kr   c                 z   t         j                  |       }|syt        j                  t        j                  z   dj                  fdt        d      D              }t        j                  d| idd|ii       |j                  d       d	|j                  d
       |dd}t        j                  | |      }|ryy)N)Fu,   Email không tồn tại trên hệ thống!rZ   c              3   H   K   | ]  }t        j                          y w)N)secretschoice).0_alphabets     r   	<genexpr>z+UserModel.reset_password.<locals>.<genexpr>r  s     !Mq'..":!Ms   "   r   $setr   r   r   r   ud   Vì lý do bảo mật, hãy đổi lại mật khẩu này ngay sau khi đăng nhập thành công.)usernamer   note)Tu>   Mật khẩu mới đã được gửi vào Email của bạn!)Fu   Lỗi khi gửi email.)r"   r(   stringascii_lettersdigitsjoinranger   r   r@   r   send_new_password_email)r   r$   random_password
email_data	mail_sentr   s        @r   reset_passwordzUserModel.reset_passwordk  s    **51H''&--7''!ME!H!MM##We$4v
O?\6]^  88K01488J3G2HI'z

 66ujI	Y.r   c                 Z    t        j                  | dddd|ii      }|j                  dkD  S )Nr$   r%   r   r   r   )r   r   r   )r   new_passwordr   s      r   update_passwordzUserModel.update_password  s:    !,,V,j,/0
 $$q((r   )r7   )NN)rZ   rM   r[   NNr   r   )r   r   r   staticmethodr   r(   r.   r5   rE   rH   rW   ra   rh   ro   rt   r   r   r0   r   r   r   r   r   r   r   r   r   r   r"   r"   (   s   K K K    " "  $ P P   	 	  & 
 
 ? ?   `
`
`
 `
 	`

 `
 `
 `
 `
D )S )% ) ) 2 2U 2 20 %;  &   / /* ) )r   r"   )rQ   r   r   r   r   r   pydanticr   bsonr   MongoDBConnectionr   r   controller.mail_helperr   r   r   r   r   r   r"   r   r   r   <module>r      sk        	    2 - xL Y y 
	 	 _) _)r   