
    iL                         d dl mZ d dlmZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
 e
d   Ze
d   Z ej                  d	      Z G d
 d      Zy)    )defaultdict)datetimeN)ProductCatalogModel)	UserModel)dbordersproductszAsia/Ho_Chi_Minhc                       e Zd Zedefd       Zed        Zed        Zedefd       Z	ed+d       Z
ed,d       Zed-d
efd       Zedefd       Zedededefd       Zedefd       Zedefd       Zedefd       Zededefd       Zed.dedededefd       Zededefd       Zed/dededefd       Zedefd       Ze	 	 	 	 d0d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-d'       Zed-d ed(ed)ed
efd*       Zy	)1ImportModeladdressc                 p   | xs dj                  d      D cg c]#  }|j                         s|j                         % }}t        |      dkD  r|d   nd}t        |      dkD  r|d   nd}t        |      dkD  r|d   nd}t        |      dkD  r|d   nd}t        |      dkD  r|d   nd}|||||dS c c}w )	N ,r               )streetcitystatecountryzipCode)splitstriplen)r   partpartsr   r   r   zip_coder   s           3/var/www/pod-logistic/pod-api/model/import_model.py_parse_addresszImportModel._parse_address   s    +2=b*?*?*DU$

UU Z!^qu:>uQxrJNa"5zA~582!%j1n%(" 
 	
 Vs
   B3B3c                     t        | xs d      }t        j                  dd|      j                         }|j	                         S Nr   z\s+ )strresubr   uppervaluetexts     r   _normalize_compare_textz#ImportModel._normalize_compare_text$   7    5;Bvvfc4(..0zz|    c                     t        | xs d      }t        j                  dd|      j                         }|j	                         S r"   )r$   r%   r&   r   lowerr(   s     r   _normalize_variant_textz#ImportModel._normalize_variant_text*   r,   r-   rowc                 6   t         j                  | j                  dd            }t         j                  | j                  dd            }t         j                  |j                  dd            }t         j                  |j                  dd            }t         j                  |j                  dd            }t         j                  |j                  dd            }t         j                  |j                  dd            }d	j	                  ||||||g      S )
Ncustomerr   r   r   r   r   r   r   z||)r   r+   getr    join)r1   customer_nameparsed_addressr   r   r   r   r   s           r   _build_group_keyzImportModel._build_group_key0   s    #;;CGGJPR<ST$33CGGIr4JK44^5G5GRT5UV22>3E3Efb3QR33N4F4FwPR4ST55n6H6HTV6WX66~7I7I)UW7XYyy
  	r-   c                     	 | | dk(  rt        |      S t        t        |       j                  dd      j                               S # t        $ r t        |      cY S w xY wNr   r   )floatr$   replacer   	Exceptionr)   defaults     r   	_to_floatzImportModel._to_floatD   sZ    	"}W~%U++C4::<== 	">!	"s   A 1A AAc                     	 | | dk(  rt        |      S t        t        t        |       j                  dd      j	                                     S # t
        $ r t        |      cY S w xY wr:   )intr;   r$   r<   r   r=   r>   s     r   _to_intzImportModel._to_intM   s_    	 }7|#uSZ//R8>>@ABB 	 w<	 s   A :A A&%A&Nid_khach_hangc                    | sdddS t        j                  |       }|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	firstNamer#   lastNameemail)r   get_user_by_idr4   r   )rD   user	full_names      r   _build_uploader_infoz ImportModel._build_uploader_infoV   s    "$#% 
 ''6"$#% 
 xxR01488J3K2LMSSU	 (@488GR+@#xx4
 	
r-   c                    g }t        | j                  d      xs d      j                         s|j                  d       t        | j                  d      xs d      j                         s|j                  d       t        | j                  d      xs d      j                         s|j                  d       t        j                  | j                  d      d	      }|d	k  r|j                  d
       |S )Nr3   r   u   Thiếu tên khách hàngr   u   Thiếu địa chỉ	productIdu   Thiếu mã sản phẩmquantityr   u!   Số lượng phải lớn hơn 0)r$   r4   r   appendr   rC   )r1   errorsrQ   s      r   _validate_basic_rowzImportModel._validate_basic_rowl   s    377:&,"-335MM563779%+,224MM01377;'-2.446MM45&&swwz':A>q=MM=>r-   product_docproduct_catalogc                    t        |j                  d      xs d      j                         }t        | xs i j                  d      xs( |j                  d      xs |j                  |      xs |      j                         S )NrP   r   titleproductName)r$   r4   r   )rU   r1   rV   
product_ids       r   _get_product_display_namez%ImportModel._get_product_display_name   sz    -34::<
B##G, ww}%"":. 	

 %'	r-   country_valuec                 <    t         j                  |       }h d}||v S )N>   u.s.ahoa kynuoc myunited states of americamyususaunited states)r   r0   )r\   
normalized	us_valuess      r   _is_us_countryzImportModel._is_us_country   s&     88G
	
	 Y&&r-   c                     t         j                  | j                  dd            }|j                  dd      }t         j                  |      rdS dS )Nr   r   r   USInternational)r   r    r4   rh   )r1   r7   r   s      r   _detect_shipping_regionz#ImportModel._detect_shipping_region   sG    $33CGGIr4JK $$Y3"11':tOOr-   ratec           	         t        | j                  d      xs d      j                         t        | j                  d      xs d      j                         t        j	                  | j                  d      d      t        j	                  | j                  d      d      t        | j                  d      xs d      j                         dS )	Nregionr   transitTimecostr   	importTaximportTaxNotero   rp   rq   rr   rs   )r$   r4   r   r   r@   )rm   s    r   _normalize_shipping_ratez$ImportModel._normalize_shipping_rate   s     $((8,2399;txx6<"=CCE))$((6*:A>$..txx/DaH /!:!@bAGGI
 	
r-   c                    | j                  d      xs g }|st        j                  |      dddddS t        j                  |      }t        j                  |      }|D ]B  }t        j                  |j                  d            }||k(  s-t        j	                  |      c S  |dk(  rG|D ]A  }t        j                  |j                  d            }|dv s,t        j	                  |      c S  nG|D ]B  }t        j                  |j                  d            }|dk(  s-t        j	                  |      c S  t        j	                  |d	         S )
NshippingRatesr           rt   ro   rj   >   rc   re   internationalr   )r4   r   rl   r0   ru   )rU   r1   shipping_ratestarget_regionnormalized_targetrm   normalized_rates          r   _pick_shipping_ratezImportModel._pick_shipping_rate   sN   $9?R%==cB! !#  $;;C@'??N" 	BD)AA$((8BTUO"33";;DAA	B
 D & F"-"E"EdhhxFX"Y"&==&??EEF
 ' F"-"E"EdhhxFX"Y"o5&??EEF
 33N14EFFr-   variantsrequested_stylerequested_sizerequested_colorc                    t         j                  |      }t         j                  |      }t         j                  |      }g }g }| D ]  }	t         j                  |	j                  d            }
t         j                  |	j                  d            }t         j                  |	j                  d            }|
|k(  su||k(  s{|j                  |	       |s||k(  s|j                  |	        |r|d   S |r|d   S y )Nstylesizecolorr   )r   r0   r4   rR   )r   r   r   r   normalized_stylenormalized_sizenormalized_colorexact_color_matchesfallback_matchesvariantvariant_stylevariant_sizevariant_colors                r   _find_matching_variantz"ImportModel._find_matching_variant   s    &>>O%==nM&>>O  		8G'??G@TUM&>>w{{6?RSL'??G@TUM 00\_5T ''0#9I(I'..w7		8 &q))#A&&r-   c                    t        | j                  d      xs d      j                         }t        j	                  d|i      }t
        j                  || |      }|sd d| dfS t        | j                  d      xs d      j                         }t        | j                  d      xs d      j                         }t        | j                  d      xs d      j                         }|sd d| dfS |sd d| d	fS |j                  d
      xs g }|sd d| dfS |D 	ch c]R  }	t        |	j                  d      xs d      j                         r$t
        j                  |	j                  d            T }
}	|D 	ch c]R  }	t        |	j                  d      xs d      j                         r$t
        j                  |	j                  d            T }}	t
        j                  |      }t
        j                  |      }||
vrd d| d| dfS ||vrd d| d| dfS t
        j                  ||||      }|sd d| dfS t
        j                  ||       }t
        j                  | j                  d      d      }t
        j                  |j                  d      |j                  d      xs d      }t
        j                  |j                  d      d      }||z  }t
        j                  |j                  d      d      }i | |||||xs, t        |j                  d      xs d      j                         |||||j                  dd      |j                  dd      d}|d fS c c}	w c c}	w )NrP   r   u   Đơn hàng "u,   " hiện tại không còn mặt hàng này.r   r   r   u   " đang thiếu style.u   " đang thiếu size.r   u!   " hiện tại đã hết style "z".u    " hiện tại đã hết size ")r   r   r   r   rQ   r   pricer   rr   rq   ro   rs   )rP   rY   r   r   r   rQ   r   tax_shipping_cost_once_shipping_region_shipping_tax_note)r$   r4   r   products_collectionfind_oner   r[   r0   r   r~   rC   r@   )r1   rV   rZ   rU   product_namer   r   r   r   vavailable_stylesavailable_sizesnormalized_requested_stylenormalized_requested_sizematched_variantshipping_raterQ   variant_priceimport_tax_per_itemline_tax_totalshipping_cost_onceenriched_rows                         r   _validate_and_enrich_rowz$ImportModel._validate_and_enrich_row   s   -34::<
)22K3LM"<<[#_=6bccccggg.4"5;;=SWWV_2399;cggg.4"5;;==6LMMM=6KLLL??:.4"=6bccc 
155>'R(..0 //g?
 
 
155=&B'--/ //f>
 
 &1%H%H%Y"$/$G$G$W!%-===6WXgWhhjkkk$O;=6VWeVffhiii%<<+)+	 = 
 =6bccc#77SI&&swwz':A>#--(OOG$)

 *33M4E4Ek4RTUV!$77(22=3D3DV3LaP

#'$"$WO,?,?,H,NB(O(U(U(W "!#5 - 1 1(B ?"/"3"3OR"H
 T!!s

s    AM'=AM,shipping_overridec                    | j                  d      xs dj                         }t        j                  d|t        j                        }|rt        |j                  d            nd}t        | j                  d      xs d      j                         }t        | j                  d      xs |j                  |      xs d      j                         }t        | j                  d      xs d      j                         ||t        j                  | j                  d      |      t        j                  | j                  d	      d
      t        | j                  d      xs d      j                         t        | j                  d      xs d      j                         | j                  d      xs dt        j                  |d
      t        j                  | j                  d      d
      d
S )Nitemsr   z\(Qty:\s*(\d+)\)r   rP   rY   r   rQ   r   r   r   r   designr   )
r   rP   rY   rQ   r   r   r   r   shippingr   )r4   r   r%   search
IGNORECASErB   groupr$   r   rC   r@   )r1   rV   r   	item_text	qty_match
parsed_qtyrZ   r   s           r   _parse_itemzImportModel._parse_item8  s|   WWW%+224	II19bmmL	09S+,q
-34::<
GGM"Ko&9&9*&EK

%' 	
 )/R0668#'#++CGGJ,?L **3777+;Q?)/R0668-2.446ggh'-2#--.?C((;
 	
r-   grouped_rowsc                     | D cg c]'  }t         j                  |j                  d      d      ) }}|syt        |      S c c}w )Nr   r   rx   )r   r@   r4   max)r   r1   shipping_candidatess      r   _get_order_shipping_oncez$ImportModel._get_order_shipping_onceQ  sR     $
 !!#''*?"@!D
 
 #&''
s   ,A	file_name	merge_key
created_atfinal_order_idc                 ~   | d   }t         j                  |       }g }	t        |       D ]5  \  }
}|
dk(  r|nd}|	j                  t         j	                  |||             7 t        d |	D              }t        d |	D              }||z   |z   }t         j                  |      }|g ||j                  dd      |j                  dd      |j                  d	d      t         j                  |j                  d
d            d|	dt        |d      ||d   |d   |xs" t        j                         j                         |ddddS )Nr   rx   )r1   rV   r   c              3   2   K   | ]  }|d    |d   z    yw)rQ   r   N .0items     r   	<genexpr>z/ImportModel._build_order_doc.<locals>.<genexpr>s  s     JDtJ'$w-7Js   c              3   &   K   | ]	  }|d      yw)r   Nr   r   s     r   r   z/ImportModel._build_order_doc.<locals>.<genexpr>t  s     6U6s   r3   r   phonerJ   r   )namer   rJ   r   Unpaidr   rF   rG   )orderIdsourceOrderIdsmergeKeyr3   r   statustotalrD   rF   rG   	createdAtimportSourcetrackingtrackingNumbertrackingLink)r   r   	enumeraterR   r   sumrN   r4   r    roundr   utcnow	isoformat)r   r   rV   rD   r   r   r   	first_roworder_shipping_oncer   indexr1   r   subtotal	total_taxr   uploader_infos                    r   _build_order_doczImportModel._build_order_doc[  s[    !O	)BB<P#L1 	JE37<z 3sLL''$3&7 ( 	 JEJJ666	9$'::#88G & !!j"5"w3"w3&55immIr6RS	 5!_*+,<=,->?#Dx'8'B'B'D% )
 	
r-   
candidatesc                     | sy | D cg c]  }|j                  d      |k(  s| }}|r|n| }d }t        ||      }|d   S c c}w )Nr   c                 v    t        | j                  d      xs d      }|t        | j                  d            fS )Nr   r   _id)r$   r4   )doccreateds     r   sort_keyz.ImportModel._pick_keeper_doc.<locals>.sort_key  s2    #''+.4"5GS011r-   )keyr   )r4   sorted)r   r   r   exact_mergepoolr   s         r   _pick_keeper_doczImportModel._pick_keeper_doc  sV    &0UsCGGJ4G94TsUU){z	2 d)Aw Vs
   AAc           	         | xs t        j                  t              } | j                  d      }| j                  dz  d}d| | d}t        j                  dt        j                  |       d      }t        j                  dd	dt        j                  |       d
iiddi      }d}|D ]X  }t        |j                  d      xs d      }|j                  |      }	|	s5t        |t        |	j                  d                  }Z |dz   }
	 | t        |
      j!                  d       }t        j#                  d|iddi      }|s|S |
dz  }
B)N%Y%m%d%H%M%Si'  03dzORD--^z(\d{4})$r   z$regexz\d{4}$r   r   r   r   r   )r   nowVN_TZstrftimemicrosecondr%   compileescapeorders_collectionfindr$   r4   matchr   rB   r   zfillr   )vn_nowtimestamp_part
milli_partprefixregexlatest_docsmax_seqr   order_idr   next_seq	generatedexisteds                r   _generate_order_idzImportModel._generate_order_id  sZ   .8<<.8**e3C8
'
|15

a		& 12*=>',,a		&(9':(#CDEN

  	<C3779-34HKK)Egs5;;q>':;		< Q;!(3x=#6#6q#9":;I'00)Y1G%QRTG  MH r-   	file_sizerowsc                    g }d}t        t              }t        j                         }t	        |      D ]  \  }}	t
        j                  |	      }
|
r'|j                  |dz   dj                  |
      d       Dt
        j                  |	|      \  }}|r|j                  |dz   |d       xt
        j                  |      }||   j                  |       |dz  } g }g }|j                         D ]@  \  }}||d}t        t        j                  |            }t
        j                  ||      }|r,t        |j!                  d      xs d      j#                         nt
        j%                         }t
        j'                  || ||||r|j!                  d	      nd |
      }|rht        j)                  d|d   id|i       |D cg c]$  }t        |d         t        |d         k7  r|d   & }}|r/t        j+                  dd|ii       nt        j-                  |       |j                  |       C |d d D ]J  }|j                  |d   |j!                  dg       |d   d   t/        |d          d|d   d   d   d       L dt1        j2                         j5                  d       t/        |      |t/        |      t/        |      t/        |      ||dS c c}w )Nr   r   z, )r1   message)r1   rV   )rD   r   r   r   r   )r   r   rV   rD   r   r   r   r   z$setz$in
   r   r3   r   r   z item(s)r   r   )r   r   r3   r   r   zIMP-r   )importId	totalRows	validRowsinvalidRowsgroupedOrderCountinsertedOrderCountrS   previewData)r   listr   get_product_catalog_mapr   r   rT   rR   r5   r   r8   r   r   r   r   r$   r4   r   r  r   
update_onedelete_many
insert_oner   r   r   r   )r   r  r  rD   import_errorsvalid_row_countgrouped_ordersrV   idxr1   rS   normalized_rowvariant_error	group_keyinserted_orderspreview_datar   r   candidate_queryexisted_docs
keeper_docr   	order_docr   duplicate_idss                            r   process_importzImportModel.process_import  s%   $T*-EEG!$ 	!HC 44S9F$$7#yy0&  ,7,P,P / -Q -)NM
 $$7,&  #44^DI9%,,^<q O1	!4 '5';';'= )	.#I|!.%O
   1 6 6 GHL$55lINJ  JNN9-34::< 335  $44)# /+#:D:>>+6$- 5 I !,,Ju-.Y'  ,!3u:#j.?*@@ J! !
 !%1155-:P2QR!,,Y7""9-S)	.V #3B' 	Cy>"%''*:B"?
OF3G-.h7z?95h?! 	 x||~66~FGHT(}-!$^!4"%o"6#'	
 		
+!s   )K)r   )r   )N)r   )rx   )Nr   Nr   )__name__
__module____qualname__staticmethodr$   r    r+   r0   dictr8   r@   rC   rN   rT   r[   rh   rl   ru   r~   r  r   r   r;   r   r   r   r   r  rB   r#  r   r-   r   r   r      s   
 
 
"  
  
 d  & " "     
C 
 
*   $ t $ QU   'c ' ' PT P P
 
t 
 
 G GD G G@   UX kn  6 P"d P"T P" P"d 
 
 
 
 
0 (t ( ( 
 " 2
2
2
 2
 	2

 2
 2
 2
 2
h T c    : a
# a
# a
T a
RU a
 a
r-   r   )collectionsr   r   r%   pytzmodel.product_catalog_modelr   model.user_modelr   MongoDBConnectionr   r   r   timezoner   r   r   r-   r   <module>r/     sK    #  	  ; &  xL n ()N
 N
r-   