o
    iTB                     @   s  d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ 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 ddlmZmZ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& G dd deZ'G dd dej(Z)dS )    )render)timezone)viewsetsstatus)action)Response)PageNumberPagination)OportunidadDeVenta)Empresa)	Provincia)	Localidad)EstadoEmpresa)Origen   )EmpresaSerializerEmpresaUpdateSerializerEmpresaDeleteSerializerEstadoEmpresaSerializerEmpresaListSerializer)swagger_auto_schema)openapi)transaction)Contactoc                   @   s   e Zd ZdZdZdZdS )StandardResultsSetPagination2   limiti  N)__name__
__module____qualname__	page_sizepage_size_query_parammax_page_size r"   r"   ./var/www/html/crm_dreinet/api_empresa/views.pyr      s    r   c                   @   s  e Zd ZeZeddgdddd Zedej	ej
g dej	ejd	d
ej	ejdd
ej	ejdd
ej	ejdd
ej	ejdd
ej	ejdd
ej	ejdd
ej	ejdd
ej	ejej	ej
ej	ejdej	ejdej	ejdej	ejdej	ejdddddd	dededddeddgddejdd  Zed!ej	ej
d"gej	ejd#d
ej	ejd	d
ej	ejdd
ej	ejd$d
ej	ejdd
ej	ejdd
ej	ejd%d
ej	ejd&d
ej	ejd'd
d(	ded)edd*d+dedd,gd-dd.d/ Zed0eed1dd*d+deddgd2dd3d4 Zeddgd5dd6d7 Zed8ej	ej
d9ej	ejd:d
id9gd;ed<dd=deddgd>dd?d@ ZeddgdAddBdC ZeddgdDddEdF ZdGS )HEmpresaViewSetFgetlist_company)detailmethodsurl_pathc                 C   sd  t jjdddddddd}|jd	}|r!|j|d
}|jd}|r/|j|d}|jd}|r=|j|d}|jd}|rlddlm	} |||d||dB ||dB ||dB ||dB ||dB }t
 }|jd}	|	r|||}
|
d urdd tj D }t|
dd|id}||jS dd tj D }t|dd|id}t|jS )NT)deleted_at__isnull	provincia	localidadestado_empresatipo_empresausuario_responsablez-fecha_creacionidr0   )tipo_empresa_idestado)estado_empresa__nombre_estadosearchr   )Q)nombre__icontains)nombre_comercial__icontains)cuit__icontains)direccion__icontains)localidad__nombre__icontains)provincia__nombre__icontainsr   c                 S      i | ]}|j |jqS r"   r0   nombre.0or"   r"   r#   
<dictcomp>K       z/EmpresaViewSet.list_company.<locals>.<dictcomp>origenes_map)manycontextc                 S   r=   r"   r>   r@   r"   r"   r#   rC   O   rD   )r
   objectsfilterprefetch_relatedselect_relatedorder_byquery_paramsr%   django.db.modelsr6   r   paginate_querysetr   allr   get_paginated_responsedatar   )selfrequestempresas
empresa_idr.   r3   r5   r6   	paginatorlimit_parampagerE   
serializerr"   r"   r#   r&      sR   


zEmpresaViewSet.list_companyzCrea una nueva empresa.)r?   r+   r,   zNombre de la empresa)typedescriptionzCUIT de la empresaz#ID del estado de empresa (opcional)zID de la provinciazID de la localidadu   Dirección (opcional)z,ID del tipo de empresa (opcional, default 1)zID del origen )r[   )r?   apellidoemailtelefonocargo)r[   
propertiesz/Lista de contactos a crear junto con la empresa)r[   itemsr\   )	r?   cuitr-   r+   r,   	direccionr.   	origen_id	contactos)r[   requiredra   zEmpresa creadazSolicitud incorrecta)     )operation_descriptionrequest_body	responsespostcreate_companyc                 C   s  t |jd}| r|jdd }|r-tjj|dd }|r-t	dd| it
jdS | }|jd	g }|r|D ]T}z5|d
d}|dd}	| d|	  }
tjj|
r[|
nd|dd|dd|dd |t d W q< ty } ztd|j d|  W Y d }~q<d }~ww |j}|j|d< |j|d< |j|d< t|dd |d< t|dd|d< |j|d< |j|d< t	|t
jdS t	|jt
jdS )N)rR   rc    T)rc   r*   errorz"Ya existe una empresa con el CUIT r   rf   r?   r]    z
Sin Nombrer^   r_   r`   )r?   r^   r_   r`   empresafecha_creacionz#Error creating contact for company z: r+   r,   rd   re   r2   r   r.   codigo_postalnombre_comercial)r   rR   is_validr%   stripr
   rH   rI   firstr   r   HTTP_400_BAD_REQUESTsaver   creater   now	Exceptionprintr0   provincia_idlocalidad_idrd   getattrru   rv   HTTP_201_CREATEDerrors)rS   rT   rZ   rc   empresa_existenters   contactos_datacontact_datar?   r]   	full_nameerR   r"   r"   r#   rn   S   sZ   &




"




zEmpresaViewSet.create_companyz&Modifica una empresa existente por ID.r0   zID de la empresa a modificarzID del estado de empresau
   DirecciónzID del tipo de empresazID del origen (opcional))	r0   r?   rc   r-   r+   r,   rd   r.   re   Empresa actualizadaEmpresa no encontrada)   ri   i  patchupdate_companyc           
   
   C   s,  |j d}|stdditjdS z	tjj|d}W n tjy-   tdditjd Y S w i }dD ]0}||j v rb|dkrJd	|j vrJ|j | |d	< q2|d
kr[d|j vr[|j | |d< q2|j | ||< q2|sntdditjdS d|j v rz|j d }|rt	||_
nd |_
|  td|j
  W n ty } ztd|  W Y d }~nd }~ww td|  t||dd}| r| }|  |j }	|j|	d	< |j|	d< |j|	d< t|dd |	d< t|dd|	d< |j|	d< |j|	d< |j
|	d< td|j
  td|	dS td|j  t|jtjdS )Nr0   rp   Se requiere el id de la empresarq   r1   r   )r?   name_comercialrc   estado_empresa_idr+   r,   rd   r.   r2   re   ru   usuario_responsable_idr   r   r   r+   r   r,   z$No se enviaron campos para modificarr   zADEBUG update_company: Manual update of usuario_responsable_id to zFDEBUG update_company: Error updating usuario_responsable_id manually: z$DEBUG update_company: update_fields=T)rR   partialrd   re   r2   r   r.   ru   rv   z>DEBUG update_company: empresa updated. usuario_responsable_id=r   )mensajers   zDEBUG update_company: errors=)rR   r%   r   r   rz   r
   rH   DoesNotExistHTTP_404_NOT_FOUNDintr   r{   r   r~   r   rw   refresh_from_dbr   r   rd   r   ru   rv   r   )
rS   rT   rV   rs   update_fieldsfielduidr   rZ   rR   r"   r"   r#   r      sb   









zEmpresaViewSet.update_companyzHElimina (soft delete) una empresa por ID. Actualiza el campo deleted_at.zEmpresa eliminadadelete_companyc                 C   s   |j d}|stdditjdS z	tjj|d}W n tjy-   tdditjd Y S w t	
 |_|  td|dtjdS )	Nr0   rp   r   rq   r1   r   zEmpresa eliminada correctamente)r   r0   )rR   r%   r   r   rz   r
   rH   r   r   r   r}   
deleted_atr{   HTTP_200_OK)rS   rT   rV   rs   r"   r"   r#   r      s   
zEmpresaViewSet.delete_companyget_statusesc                 C   s    t j }t|dd}t|jS )NT)rF   )r   rH   rP   r   r   rR   )rS   rT   estadosrZ   r"   r"   r#   r     s   

zEmpresaViewSet.get_statusesz9Devuelve los contactos asociados a una empresa por su ID.rV   zID de la empresa)r[   ra   rg   zContactos de la empresa)r   ri   get_clientsc                 C   sN   |j d}|stdditjdS tjj|ddddd	}tt	|tj
dS )
NrV   rp   r   rq   TrV   r*   r0   r?   r^   )rM   r%   r   r   rz   r   rH   rI   valueslistr   )rS   rT   rV   rf   r"   r"   r#   r     s
   zEmpresaViewSet.get_clientsoportunity_clientsc                 C   s   |j d}|stdditjdS tjj|ddd}g }|D ]}|	|j
|j|j|jr1|jjnd d q td	|itjdS )
N	id_clientrp   u#   Se requiere el parámetro id_clientrq   Tr   estado_oportunidad)r0   r?   rt   r   rR   )rM   r%   r   r   rz   r	   rH   rI   rK   appendr0   r?   rt   r   nombre_estador   )rS   rT   r   oportunidadesrR   rB   r"   r"   r#   r   4  s"   
z!EmpresaViewSet.oportunity_clientsclient_contactsc                 C   sx   |j d}td|  |stdditjdS tjj|dd	dd	d
dd}td|
  d|  tt|tjdS )Nr   z6DEBUG: client_contacts endpoint called with id_client=rp   zSe requiere el id del clienterq   Tr   r0   r?   r^   r_   r`   zDEBUG: Found z contacts for client )rM   r%   r   r   r   rz   r   rH   rI   r   countr   r   )rS   rT   r   rf   r"   r"   r#   r   I  s   zEmpresaViewSet.client_contactsN)r   r   r   r   serializer_classr   r&   r   r   SchemaTYPE_OBJECTTYPE_STRINGTYPE_INTEGER
TYPE_ARRAYr   r   atomicrn   r   r   r   r   r   r   r   r"   r"   r"   r#   r$      s    
4

#7
9	

r$   N)*django.shortcutsr   django.utilsr   rest_frameworkr   r   rest_framework.decoratorsr   rest_framework.responser   rest_framework.paginationr   !Models.oportunidad_de_venta_modelr	   Models.Empresar
   Models.Provinciar   Models.Localidadr   Models.Estado_Empresar   Models.origenr   serializersr   r   r   r   r   drf_yasg.utilsr   drf_yasgr   	django.dbr   Models.contacto_modelr   r   ViewSetr$   r"   r"   r"   r#   <module>   s&    