o
    hn$                     @   sd   d dl mZ d dlmZ d dlmZ e ZG dd dejZG dd dejZ	G dd	 d	ejZ
d
S )    )models)get_user_model)Customerc                       s  e Zd Zg dZg dZg dZg dZejddddZ	ejd	d
Z
e ZejeejdddddZejeejdddZejeejddddZejdejdddddZejdeddZejdeddZejdeddZejdedddZejdddd Zejdd!d"Zejd	dd#d Zejdd$d%Zej ddd&d'Z!ejdd(d%Z"ej#ddd)d'Z$ej#ddd*d'Z%ej ddd+d'Z&ej ddd,d'Z'ejdd-d%Z(ejdd.d%Z)ej#ddd/d'Z*ej#ddd0d'Z+ejdd1d%Z,ejd2dg d3d4d5Z-ej.ddd6d'Z/ejdd7d"Z0ejdd8d%Z1ejdd9d%Z2ej#dd:Z3ej#dd;Z4ej#ddd<Z5 fd=d>Z6e7d?d@ Z8e7dAdB Z9e7dCdD Z:e7dEdF Z;e7dGdH Z<e7dIdJ Z=dKdL Z>G dMdN dNZ?  Z@S )OTicket))lowLow)mediumMedium)highHigh)urgentUrgent))openOpen)in_progresszIn Progress)resolvedResolved)closedClosed)	scheduled	Scheduled)	postponed	Postponed)	)	technicalzTechnical Issue)billingzBilling Issue)installationzInstallation Request)maintenanceMaintenance)	complaint	Complaint)reminderzReminder/Follow-up)enquiryzCustomer Enquiry)
site_visitz
Site Visit)otherOther))taskzTask/Work Order)r    Reminder)eventEvent)appointmentAppointment   TF)
max_lengthuniqueeditable   )r,   ticketsz9Optional - leave blank for infrastructure/company tickets)	on_deleterelated_namenullblank	help_textcreated_tickets   )r1   r2   defaultassigned_tickets)r1   r3   r4   r2   zhr.EmployeezAssign to specific employee)r1   r3   r4   r2   r5   
   r   )r,   choicesr8   r   r   r%   zType of ticket/event)r,   r;   r8   r5      zContact phone for this event)r,   r4   r5   zContact email for this event)r4   r5   zLocation for this task/eventzIs this a reminder/follow-up?r8   r5   z#Send reminder before scheduled time)r3   r4   r5   zHas reminder been sent?z"When this task should be performedz$When this task should end (optional)zEstimated time to completezActual time taken to completezIs this a scheduled task?zIs this an all-day event?zWhen work actually startedzWhen work was completedzIs this a recurring event?2   ))dailyDaily)weeklyWeekly)monthlyMonthly)yearlyYearlyzHow often this event repeats)r,   r4   r;   r5   z!When recurring events should stopz1Special instructions or notes for this task/eventz(Does this require customer confirmation?z(Has customer confirmed this appointment?auto_now_add)auto_now)r3   r4   c                    sf   | j s(tjjddd }|rt|j dd  }|d }nd}d|d| _ t j|i | d S )NTKT)ticket_id__startswithz
-ticket_id   r7   03d)		ticket_idr   objectsfilterorder_byfirstintsupersave)selfargskwargslast_ticketlast_number
new_number	__class__ ./var/www/html/optinet_system/tickets/models.pyrU   b   s   
zTicket.savec                 C   s*   | j r| j jS | jr| j p| jjS dS )z-Return the assigned person (employee or user)
Unassigned)assigned_employee	full_nameassigned_toget_full_nameusernamerV   r^   r^   r_   assigned_personn   s
   zTicket.assigned_personc                 C   s    | j r| j jS | jr| jjS dS )z)Return the assigned person ID for displayN)ra   employee_idrc   re   rf   r^   r^   r_   assigned_person_idw   s
   zTicket.assigned_person_idc                 C   s(   | j r| j S | jr| jr| j| j S dS )zGCalculate scheduled end time based on start time and estimated durationN)scheduled_end_datescheduled_dateestimated_durationrf   r^   r^   r_   scheduled_end_time   s
   zTicket.scheduled_end_timec                 C   s.   | j r| jdvrddlm} | | j kS dS )z#Check if scheduled task is past due)r   r   r   timezoneF)rk   statusdjango.utilsro   nowrV   ro   r^   r^   r_   is_past_due   s   zTicket.is_past_duec                 C   s,   | j rddlm} | j  |  kS dS )z$Check if task is scheduled for todayr   rn   F)rk   rq   ro   daterr   rs   r^   r^   r_   is_today   s   zTicket.is_todayc                 C   s   | j r| j jS dS )z6Return customer name or indicate it's a company ticketzCompany/Infrastructure)customerrb   rf   r^   r^   r_   customer_name   s   zTicket.customer_namec                 C   s   | j  d| j S )Nz - )rN   titlerf   r^   r^   r_   __str__   s   zTicket.__str__c                   @   s   e Zd ZdgZg dZdS )zTicket.Metaz-created_at))can_view_calendarz Can view calendar and scheduling)can_edit_schedulezCan edit and manage schedules)can_view_all_schedulesz!Can view all technician schedules)can_assign_ticketsz!Can assign tickets to techniciansN)__name__
__module____qualname__orderingpermissionsr^   r^   r^   r_   Meta   s    r   )Ar   r   r   PRIORITY_CHOICESSTATUS_CHOICESCATEGORY_CHOICESTICKET_TYPE_CHOICESr   	CharFieldrN   ry   	TextFielddescription
ForeignKeyr   CASCADErw   User
created_bySET_NULLrc   ra   priorityrp   categoryticket_typecontact_phone
EmailFieldcontact_emaillocationBooleanFieldis_reminderDurationFieldreminder_beforereminder_sentDateTimeFieldrk   rj   rl   actual_durationis_scheduled
is_all_daywork_started_atcompleted_atis_recurringrecurrence_pattern	DateFieldrecurrence_end_datespecial_instructionsrequires_customer_confirmationcustomer_confirmed
created_at
updated_atresolved_atrU   propertyrg   ri   rm   rt   rv   rx   rz   r   __classcell__r^   r^   r\   r_   r      sp    	





r   c                   @   sf   e Zd ZejeejddZejeejdZ	e
 ZejdddZejddZd	d
 ZG dd dZdS )TicketCommentcommentsr1   r2   r1   Fz$Internal notes only visible to staffr=   TrG   c                 C   s   d| j j d| jj S )NzComment on z by )ticketrN   userre   rf   r^   r^   r_   rz      s   zTicketComment.__str__c                   @      e Zd ZdgZdS )zTicketComment.Metar   Nr   r   r   r   r^   r^   r^   r_   r          
r   N)r   r   r   r   r   r   r   r   r   r   r   commentr   is_internalr   r   rz   r   r^   r^   r^   r_   r      s    r   c                   @   s   e Zd ZejeejddZejeejdZ	ej
ddZejdddZejdd	Zd
d Zedd Zedd ZG dd dZdS )TicketAttachmentattachmentsr   r   ztickets/attachments/)	upload_tor/   T)r,   r4   rG   c                 C   s   d| j j S )NzAttachment for )r   rN   rf   r^   r^   r_   rz      s   zTicketAttachment.__str__c                 C   sL   | j r$| j j}dD ]}|dk r|dd|   S |d }q	|ddS dS )z)Return file size in human readable format)BKBMBGBi   z.1f z TBUnknown)filesize)rV   r   unitr^   r^   r_   	file_size   s   
zTicketAttachment.file_sizec                 C   s   | j r| j j dS dS )zCheck if the file is an image)z.pngz.jpgz.jpegz.gifz.bmpz.webpF)r   namelowerendswithrf   r^   r^   r_   is_image   s   zTicketAttachment.is_imagec                   @   r   )zTicketAttachment.Metaz-uploaded_atNr   r^   r^   r^   r_   r      r   r   N)r   r   r   r   r   r   r   r   r   uploaded_by	FileFieldr   r   r   r   uploaded_atrz   r   r   r   r   r^   r^   r^   r_   r      s    

r   N)	django.dbr   django.contrib.authr   customers.modelsr   r   Modelr   r   r   r^   r^   r^   r_   <module>   s     &