
    -6i&U                     `   d Z ddlZddlmZmZmZmZmZ ddlm	Z	 ddl
mZmZmZmZ ddlmZ ddlm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 ddlmZmZ ddlm Z  ddlm!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0 ddlm1Z1 ddl2m3Z3 ddl4m5Z5 ddlm6Z6m7Z7 ddl8m9Z: ddl;m<Z< ddl=m>Z>m?Z?m@Z@ ddlAmBZC ddlDmEZE  ej                  eG      ZH	 	 	 	 	 	 	 d>de	de#d eeI   d!eeI   d"eId#eeI   d$eJd%eJd&eKd'eeIef   fd(ZLde	d)e!d'e fd*ZMde	d+eId'ee    fd,ZNde	d+eId)e"d'ee    fd-ZOde	d+eId'eKfd.ZPde	d/eeI   d'eJfd0ZQde	d1ee   d2eId3e5d4e3d+eId'ee0   fd5ZRde	d+eId4e3d3e5d6eJd'efd7ZSde	d4e3d)e>d+eId8e5d'e@fd9ZTde	d:eJd)e?d+eId'e@f
d;ZUde	d4e3d+eId'ee@   fd<ZVde	d4e3d+eId'eee      fd=ZWy)?z1
Product services for business logic operations.
    N)OptionalListTupleAnyDict)Session)selectupdatedeletefunc)IntegrityError)datetime)status
UploadFile)APIException)FilterOperators)API_PREFIXES)Productproduct_attachments_map)ProductResponseSchema)ProductCreateSchemaProductUpdateSchemaProductListFilterSchema)QueryPaginator)generate_unique_slug)settings)File)remove_file_singleupload_file_multiple)FileResponseSchema)product_notes_map)MerchantSchema)
UserSchema)ALLOWED_FILE_CONTENT_TYPESMAX_UPLOAD_LIMIT)requests)Note)NoteCreateRequestSchemaNoteUpdateRequestSchema
NoteSchema)services)upload_multiple_filesdbfilters_from_tosort_byfieldsskiplimitpaginatereturnc	           
      T  K   	 t        j                          t        j                  j                   }	t        t              }
t        t        d      r.|
j                  t        j                  j                  d            }
|r8t        j                  |d      }|
j                  t        j                  |k\        }
|rMt        j                  |d      }|j                  dddd      }|
j                  t        j                  |k        }
|j                  r~d|j                   d}|
j                  t        j                   j#                  |      t        j$                  j#                  |      z  t        j&                  j#                  |      z        }
|j                   r<|
j                  t        j                   j#                  d|j                    d            }
|j&                  r<|
j                  t        j&                  j#                  d|j&                   d            }
|j(                  r<|
j                  t        j(                  j#                  d|j(                   d            }
|j*                  ,|
j                  t        j*                  |j*                  k(        }
|j,                  :|
j                  t        j,                  |j,                  j/                         k(        }
|j0                  ,|
j                  t        j0                  |j0                  k(        }
|j2                  d	k7  r1|j2                  d
k(  }|
j                  t        j2                  |k(        }
|j4                  d	k7  r1|j4                  d
k(  }|
j                  t        j4                  |k(        }
|j6                  d	k7  r1|j6                  d
k(  }|
j                  t        j6                  |k(        }
|j8                  d	k7  r1|j8                  d
k(  }|
j                  t        j8                  |k(        }
|j:                  rt=        j>                  |j:                        }|d   t@        jB                  k(  r%|
j                  t        jD                  |d   k(        }
|d   t@        jF                  k(  r5|
j                  t        jD                  jI                  |d   |d               }
|d   t@        jJ                  k(  r%|
j                  t        jD                  |d   kD        }
|d   t@        jL                  k(  r%|
j                  t        jD                  |d   k        }
|jO                  d      rC|d
d }t        t        |      r]|
jQ                  tS        t        |      jU                               }
n/t        t        |      r|
jQ                  tS        t        |            }
|r+tW        |
tX        |	| t        ||d      }|j[                         S | j]                  |
j_                  |      ja                  |            jc                         je                         }|D cg c]  }tY        jf                  |       c}S c c}w # th        $ r/}tj        jm                  d|        dto        |      icY d}~S d}~ww xY ww)zD
    Get products list with filtering, sorting, and pagination.
    
deleted_atNz%Y-%m-%d   ;   i?B )hourminutesecondmicrosecond%r      operatorstartend-T)queryschemaurlr-   modeloffsetr4   use_ormzError getting products list: error)8r   api_base_urlr   PRODUCTSvaluer	   r   hasattrwherer8   is_r   strptime
created_atreplacesearchnameilikedescriptionskucodemerchant_id	item_typelowercategory_id	is_activeis_newis_purchaseis_sellcost_price_rangejsonloadsr   EQUAL_TO
unit_price
IN_BETWEENbetweenIS_GREATER_THANIS_LESS_THAN
startswithorder_bygetattrdescr   r   to_dictexecuterI   r4   scalarsallmodel_validate	ExceptionloggerrK   str)r-   r.   r/   r0   r1   r2   r3   r4   r5   pagination_urlstmt	from_dateto_datesearch_termis_active_boolis_new_boolis_purchase_boolis_sell_boolcost_price_range_json
field_name	paginatorresultsproductes                           X/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/apps/products/services.pyget_products_listr   +   s_    q!!)!6!6!8 9,:O:O:U:U9VW g7L)::g0044T:;D ))%<I::g00I=>D''Z8Goo2bQWoXG::g00G;<D>>gnn-Q/K::##K0$$**;79"";/1D <<::gll001W\\N!1DEFD;;::gkk//!GKK=0BCDD<<::gll001W\\N!1DEFD*::g11W5H5HHID(::g//73D3D3J3J3LLMD*::g11W5H5HHID !$..!3N::g//>ABD>>Q!..A-K::gnn;<D!#&22a7::g115EEFD??a"??a/L::goo=>D##$(JJw/G/G$H!$Z0O4L4LLzz&&*?*HH %Z0O4N4NNzz&&..-g68Me8T
 %Z0O4S4SSzz&&)>w)GG %Z0O4P4PPzz&&)>w)GG
 c" Jw
+}}WWj%A%F%F%HIw(}}WWg%>? &,"	I $$&& jjT!2!8!8!?@HHJNNPGQXYg)88AYYY !4QC89Q  !sT   Z(W5Y- 9Z(:AY- 	Y(%Y- 'Z((Y- -	Z%6$Z Z%Z( Z%%Z(payloadc                   K   |j                         }|j                  dd      }|j                  dd      }|j                  d      st        | t        |j
                        |d<   t	        di |}| j                  |       | j                          | j                  |       |rh|ft        |      dkD  rX	 |D ]B  }t        j                         j                  |j                  |      }| j                  |       D | j                          |rS|Q	 t        j                         j                  |j                  |      }| j                  |       | j                          t)        j*                  |      S # t        $ r" t!        t"        i t$        j&                  d	      w xY w# t        $ r" t!        t"        i t$        j&                  d
	      w xY ww)z
    Create a new product.
    attachmentsN	thumbnailslug)r-   instance
slug_labelr   )
product_idfile_idzAttachment already existsmodulerK   status_codemessagezThumbnail already exists )
model_dumppopgetr   r   rV   addcommitrefreshlenr   insertvaluesidrq   r   r   __name__r   HTTP_400_BAD_REQUESTr   rt   )r-   r   product_dictr   r   new_productattachment_idattachemnts_map_querys           r   create_productr      s     %%'L ""=$7K  d3IF#3|| 
V )L)KFF;IIKJJ{/c+6F6J	!, 2(?(F(F(H(O(O&>>= )P )% 

01	2
 IIK y,	$;$B$B$D$K$K&>>9 %L %! JJ,-IIK !//<<+  	"773	 	  	"772	 	s8   B4G7AE8 GAF& #G8+F##G&+GGr   c                 t  K   	 t        t              j                  t        j                  |k(  t        j                  j                  d            }| j                  |      }|j                         }|rt        j                  |      S y# t        $ r"}t        j                  d|        Y d}~yd}~ww xY ww)z
    Get a product by ID.
    NzError getting product by ID: )r	   r   rP   r   r8   rQ   rq   scalar_one_or_noner   rt   ru   rv   rK   )r-   r   ry   resultr   r   s         r   get_productr      s     g$$LLD ""4(
 D!++-(77@@ 4QC89s/   B8BB
 B8
	B5B0+B80B55B8c                 >  K   	 t        t              j                  t        j                  |k(  t        j                  j                  d            }| j                  |      }|j                         }|sy|j                  d      }|rt        j                         |d<    t        t              j                  t        j                  |j                  k(  t        j                  j                  d            j                  di |}| j                  |       | j                          | j                  |       t!        j"                  |      S # t$        $ r}t&        j)                  d|        dt+        |j,                        j/                         v rt1        d      dt+        |j,                        j/                         v rt1        d	      t1        d
      d}~wt2        $ r4}t&        j)                  d|        t1        dt+        |             d}~ww xY ww)z!
    Update a product by ID.
    NT)exclude_unset
updated_atz!IntegrityError updating product: rY   z$Product with this SKU already existsr   z%Product with this slug already existsz*Product update failed due to data conflictzError updating product: zProduct update failed: r   )r	   r   rP   r   r8   rQ   rq   r   r   r   utcnowr
   r   r   r   r   r   rt   r   rv   rK   rw   origr]   
ValueErrorru   )	r-   r   r   ry   r   r   update_dataupdate_stmtr   s	            r   update_productr     s    -=g$$LLD ""4(

 D!++- ((t(<(0(9K%wJJ'**,&&**40
 ' &'  JJ{#IIKJJw$33G<< K8<=CK%%''CDDs166{((**DEEIJJ =/s3423q6(;<<=sC   HA0E 4H5CE H	HBGH&/HHHc                   K   	 t        t              j                  t        j                  |k(  t        j                  j                  d            }| j                  |      }|j                         }|syt        t              j                  t        j                  |k(  t        j                  j                  d            j                  t        j                               }| j                  |       | j                          y# t        $ r4}t        j                  d|        t!        dt#        |             d}~ww xY ww)z/
    Delete a product by ID (soft delete).
    NFr8   TzError deleting product: zProduct deletion failed: )r	   r   rP   r   r8   rQ   rq   r   r
   r   r   r   r   ru   rv   rK   r   rw   )r-   r   ry   r   r   r   r   s          r   delete_productr   N  s    ?g$$LLD ""4(

 D!++- 7OU$""&&t,
 Vx0V1 	 	

;
		 ?/s344SVH=>>?s6   EA0D 4E5BD E	E/D>>EEslugsc                   K   	 t        t              j                  t        j                  j	                  |      t        j
                  j                  d            j                  t        j                               }| j                  |      }| j                          |j                  S # t        $ r4}t        j                  d|        t!        dt#        |             d}~ww xY ww)z8
    Delete multiple products by IDs (soft delete).
    Nr   zError bulk deleting products: zBulk deletion failed: )r
   r   rP   r   in_r8   rQ   r   r   r   rq   r   rowcountru   rv   rK   r   rw   )r-   r   r   r   r   s        r   bulk_delete_productsr   w  s     < 7OU  '""&&t,
 Vx0V1 	 K(
		 <5aS9:1#a&:;;<s)   C,B'B, +C,,	C)5/C$$C))C,files	file_typecurrent_usermerchantc           
      8  K   t        |      t        kD  r+dt         d}t        t        i t        j
                  |      |D ]d  }|j                  j                  d      d   }|t        vs*d| ddj                  t               }t        t        i t        j
                  |       t        | ||j                   d| d      }	t        | |	|||	       d
{   }
d}t        | |       d
{   }|
s!t        t        i t        j
                  |      	 |
D ]L  }t        j                         j!                  |j"                  |j"                        }| j%                  |       N | j'                          t*        j1                  ddd|j                  |j2                  |j.                  d       |
S 7 7 # t(        $ rS t*        j-                  ddd||j                  |j.                  d       t        t        i t        j
                  d      w xY ww)zH
    Create multiple files entry for a product and map attachments.
    zA maximum of z files can be uploaded at oncer   /r@   zCannot upload z$ files. Allowed file extensions are z, )r-   r   r   
created_byr   NzFailed to upload filesr-   r   )r   r   z)Could not save product attachment mappingr   )r   	submoduleproduct_slugr[   created_by_idextrazproduct attachment addr   r   r[   r   r   )r   r%   r   r   r   r   content_typesplitr$   joinr   r[   r,   r   r   r   r   r   rq   r   ru   rv   rK   user_idinfor   )r-   r   r   r   r   r   msgf	extensionuploaded_files	new_filesproduct_data	file_datamap_statements                 r   upload_attachments_filesr     sA     5z$$.//MN263N3NX[
 	

  	NN((-a0	66 +O99789;  rv7R7R\_ 	 "6
Eh**+1TF!4"N ,^y\\d I #C$66L263N3NX[
 	

" 	&I3::<CC! D M JJ}%		&
 			& KK "#//(--)11
  	 _
 7  
7#& $'33!-!5!5 	 		
 33?	
 	

sE   A)H,A-HF7H0F91'HA!F; :>H9H;AHHr   c                    K   t        | |       d{   }| j                  t        t              j	                  t        j
                  |k(              j                         }|!t        t        i t        j                  d      	 t        j                         j	                  t        j                  j                  |k(  t        j                  j                  |j
                  k(        }| j                  |       | j!                          t        t              j	                  t        j
                  |k(        }| j                  |      j                         }	|	ft#        |	j$                         t        t              j	                  t        j
                  |k(        }
| j                  |
       | j!                          t(        j5                  ddd|j,                  |j6                  |j.                  d
       ddiS 7 # t&        $ rm}t(        j+                  ddd|j,                  ||j.                  t1        |      d	
       t        t        i t        j2                  dt1        |      z         d}~ww xY ww)zI
    Delete a product's attachment file by product slug and file id.
    r   Nz"The requested file was not found, r   )pathz#Could not delete product attachmentcustomerr   )r   r   r[   r   r   rK   r   zCould not delete attachment, zproduct attachment file deletedr   deletedT)r   rq   r	   r   rP   r   r   r   r   r   HTTP_404_NOT_FOUNDr   r   cr   r   r   r   upload_pathru   rv   rK   r[   r   rw   r   r   r   )r-   r   r   r   r   r   r   dry   r   del_stmtr   s               r   delete_attachments_filesr     s     %66L 

6$<--dgg.@ABUUWI118	
 	
%
 $**,22'))11W<'))44G 	
 	

1
		 d|!!$''W"45D!446F$6$67d|))$''W*<=HJJx IIK( KK) "#//(--)11
  	 t{ 7@  
1$&'33 $!-!5!5Q 	 
	
 333c!f<	
 	

s7   I>HA3I>D;H A I>	I;A(I66I;;I>r   c                   K   t        | |       d{   }|s!t        t        i t        j                  d      t        j                  | ||j                         d{   }t        j                         j                  |j                  |j                        }| j                  |       | j                          |S 7 7 bw)zCreate Product Noter   NProduct not foundr   )r-   r   r   )note_idr   )r   r   r   r   HTTP_412_PRECONDITION_FAILEDnote_servicescreate_noter   r!   r   r   rq   r   )r-   r   r   r   r   r   noter   s           r   r   r   3  s       2D11G;;'	
 	
 **wjmm D &,,.55GJJ 6 M JJ}IIKK) 2s#   CCAC C!A!CCr   c                    K   t        | |       d{   }|s!t        t        i t        j                  d      t        j                  | ||       d{   }|S 7 I7 w)zEdit Customer Noter   Nr   r   )r-   	object_idr   )r   r   r   r   r   r   update_note_by_id)r-   r   r   r   r   updateds         r   update_noter   S  si       2D11G;;'	
 	
 "33' G N 2s"   A!AAA!AA!A!c                   K   t        | |       d{   }|s!t        t        i t        j                  d      t        t              j                  t        t        j                  t        j                  j                  k(        j                  t        j                  j                  |j                  k(        j                  t        j                  j!                               }| j#                  |      j%                         j'                         }|D cg c]  }t)        j*                  |       c}S 7 #c c}w w)zGet Note listr   Nr   r   )r   r   r   r   r   r	   r'   r   r!   r   r   r   rP   r   rm   rS   ro   rq   rr   rs   r*   rt   )r-   r   r   r   ry   notesns          r   	list_noter   k  s       2D11G;;'	
 	
 	t	,=,?,?,G,G!G	H	 ""--;	<	$//&&(	)	 	 JJt$$&**,E278QJ%%a(88! 2  9s"   D>D6DD>D93D>9D>c                    K   t        | |       d{   }|s!t        t        i t        j                  d      g S 7 )w)zGet activities listr   Nr   r   )r   r   r   r   r   )r-   r   r   r   s       r   
activitiesr     sE       2D11G;;'	
 	
 I 2s   ?=*?)NNz-created_atNr      T)X__doc__rd   typingr   r   r   r   r   sqlalchemy.ormr   
sqlalchemyr	   r
   r   r   sqlalchemy.excr   r   loggingfastapir   r   src.core.exceptionsr   src.core.utils.enumsr   src.core.utils.constantsr    src.apps.products.models.productr   r    src.apps.products.schemas.commonr   r   r   r   src.helpers.paginationr   src.apps.base.utils.functionsr   src.core.configr   src.apps.files.models.filer   src.apps.files.helper.ior   r   "src.apps.files.schemas.file_commonr    r!   *src.apps.merchants.schemas.merchant_commonr"   "src.apps.users.schemas.user_commonr#   r$   r%   src.apps.products.schemasr&   product_note_requestssrc.apps.notes.models.noter'   src.apps.notes.schemas.commonr(   r)   r*   src.apps.notesr+   r   src.apps.files.file_servicesr,   	getLoggerr   rv   rw   intboolr   r   r   r   r   r   r   r   r   r   r   r   r       r   <module>r     sN    3 3 " 3 3 )   & , 0 1 M B m m 1 > $ + M A > E 9 Q G + 
 5 >			8	$    !!$! C=! 
#	!
 ! SM! ! ! ! 
#s(^!D==== !== 	==Z  #$	66=6= 6= !	6=
 #$6=r&?&? &? 
	&?R<< 9< 		<<QQ
Q Q 	Q
 Q Q 

QhGG
G G 	G
 G 
GT % 	
  @ % 	
 099)9149	*9.)14d4jr  