o
    ܦhG=                     @   s8  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 e ZG d	d
 d
ejZG dd dejZeZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZ dS )     )forms)get_user_model)timezone)	timedelta   )CustomerServiceCustomerTagMarketingWeeklyReportMarketingLeadInteraction)Decimal)ValidationErrorc                       s^   e Zd ZejdejddddddZG dd	 d	Zd
d Zd fdd	Z	 fddZ
  ZS )CustomerFormFform-controlz+Enter parent customer ID (for sub-accounts)classplaceholderattrszILeave empty for main accounts. Enter parent customer ID for sub-accounts.requiredwidget	help_textc                   @   s  e Zd ZeZg dZi dejddiddejddiddejddiddejddidd	ejddidd
ejddiddejddiddejddiddej	dddddejddiddej
ddiddejddiddejddiddejddiddej
ddiddejdddddejddddej	ddddejddidej	ddddejddiddZdS )zCustomerForm.Meta)customer_type	full_nameid_passportcompany_namecontact_person_first_namecontact_person_last_namebusiness_registration_number
vat_numbercompany_addressbilling_contact_namebilling_contact_emailbilling_contact_phonekra_pinphoneemailgps_latitudegps_longitudephysical_addressservicenotestagsr   r   r   r   r   r   r   r   r   r   r    r!      r   rowsr"   r#   r$   r%   r&   r'   r(   anyr   stepr)      )r*   r+   r,   r-   N)__name__
__module____qualname__r   modelfieldsr   Select	TextInputTextarea
EmailInputNumberInputSelectMultiplewidgets rA   rA   //var/www/html/optinet_system/customers/forms.pyMeta   sV    	
rC   c                 C   sD   | j d}|r ztjj|dd}|W S  tjy   tdw d S )Nparent_customer_idF)customer_idis_sub_accountz4Parent customer not found or is a sub-account itself)cleaned_datagetr   objectsDoesNotExistr   )self	parent_idparentrA   rA   rB   clean_parent_customer_id4   s   z%CustomerForm.clean_parent_customer_idTc                    sB   t  jdd}| jd}|r||_d|_|r|  |   |S )NFcommitrD   T)supersaverG   rH   parent_customerrF   save_m2m)rK   rP   customerrS   	__class__rA   rB   rR   >   s   zCustomerForm.savec                    s<  t   }|d}|dkr|ds| dd n%|dkr?|ds)| dd |ds4| dd	 |d
s?| d
d |d}|rdd l}|dd|}|dr`|dd  |d< |S |drk||d< |S |dr|d|dd   |d< |S t|dkrd| |d< |S t|dkr||d< |S d| |d< |S )Nr   
individualr   z/Full name is required for individual customers.institutionr   z5Company name is required for institutional customers.r   zBContact person first name is required for institutional customers.r   zAContact person last name is required for institutional customers.r&   r   z[^\d+] z+254r   2540	   )rQ   cleanrH   	add_errorresub
startswithlen)rK   rG   r   r&   r`   rV   rA   rB   r^   L   sD   









	zCustomerForm.cleanT)r5   r6   r7   r   	CharFieldr;   rD   rC   rN   rR   r^   __classcell__rA   rA   rV   rB   r      s    "
r   c                   @      e Zd ZG dd dZdS )ServiceFormc                	   @   s   e Zd ZeZg dZejddidejddidejddidejddddej	ddidejddddej
ddiddZd	S )
zServiceForm.Meta)name
speed_mbpsfup_gbpricebilling_cycleinstallation_fee	is_activer   r   r   0.01r2   zform-selectform-check-inputN)r5   r6   r7   r   r8   r9   r   r;   r>   r:   CheckboxInputr@   rA   rA   rA   rB   rC   s   s    
rC   Nr5   r6   r7   rC   rA   rA   rA   rB   rh   r       rh   c                   @   rg   )CustomerTagFormc                   @   sL   e Zd ZeZg dZejddidejddddejdddddZ	d	S )
zCustomerTagForm.Meta)ri   descriptioncolorr   r   r   r4   r/   rw   r   typeN)
r5   r6   r7   r	   r8   r9   r   r;   r<   r@   rA   rA   rA   rB   rC      s    
rC   Nrs   rA   rA   rA   rB   ru      rt   ru   c                	   @   s   e Zd Zg dZejeejddiddZejdddej	dd	d
dddZ
ejdejdddddZejddejdddddZdS )CustomerBalanceForm))creditzCredit (Payment/Top-up))debitzDebit (Bill Payment))refundRefund)
adjustmentzManual Adjustmentr   r   r   choicesr   
   r.   g{Gz?rp   zEnter amount)r   r3   r   )
max_digitsdecimal_places	min_valuer      z Description for this transactionr   )
max_lengthr   d   FzReference ID (optional))r   r   r   N)r5   r6   r7   TRANSACTION_TYPE_CHOICESr   ChoiceFieldr:   transaction_typeDecimalFieldr>   amountre   r;   rv   reference_idrA   rA   rA   rB   rz      sB    

rz   c                       sT   e Zd ZejdejddddddZejejddddd	Z fd
dZ  Z	S )CustomerAccountSetupForm   r   z(Create a password (minimum 8 characters)r   r   z,Password must be at least 8 characters long.)
min_lengthr   r   zConfirm your password)r   c                    s<   t   }|d}|d}|r|r||krtd|S )Npasswordconfirm_passwordzPasswords don't match.)rQ   r^   rH   r   r   )rK   rG   r   r   rV   rA   rB   r^      s   



zCustomerAccountSetupForm.clean)
r5   r6   r7   r   re   PasswordInputr   r   r^   rf   rA   rA   rV   rB   r      s     r   c                       s6   e Zd ZG dd dZ fddZ fddZ  ZS )MarketingWeeklyReportFormc                   @   s   e Zd ZeZg dZejddddejddddejddddejddddejddddejddddejddddejddddejddddejddddejddddejddddd	Z	d
S )zMarketingWeeklyReportForm.Meta)marketing_staffreviewed_byreviewed_atreview_commentsstatusdater   ry   r   r      r0   r   r4   )week_startingweek_endingcustomer_feedback_summarycompetitor_activitiesmarket_trends_observed#service_improvement_recommendationspricing_recommendations"marketing_strategy_recommendationschallenges_facedsolutions_implementednext_week_targetssupport_neededN)
r5   r6   r7   r
   r8   excluder   	DateInputr<   r@   rA   rA   rA   rB   rC      s     
rC   c                    sf   t  j|i | | jjs1t  }|t| d }|tdd }|| j	d _
|| j	d _
d S d S )N)days   r   r   )rQ   __init__instancepkr   nowr   r   weekdayr9   initial)rK   argskwargstodaymondaysundayrV   rA   rB   r      s   z"MarketingWeeklyReportForm.__init__c                    sT   t   }|d}|d}|r(|r(||krtd|| jdkr(td|S )Nr   r   z1Week ending date must be after week starting dater   z7Report period must be exactly 7 days (Monday to Sunday))rQ   r^   rH   r   r   r   )rK   rG   r   r   rV   rA   rB   r^      s   




zMarketingWeeklyReportForm.clean)r5   r6   r7   rC   r   r^   rf   rA   rA   rV   rB   r      s    r   c                       s*   e Zd ZG dd dZ fddZ  ZS )MarketingLeadInteractionFormc                   @   sl   e Zd ZeZdgZejddddejddddejddddejddddej	d	dd
ddZ
dS )z!MarketingLeadInteractionForm.Metaweekly_reportr   r   r   r   r4   r   r.   rp   )r3   r   )interaction_datefollow_up_dater,   follow_up_notesestimated_valueN)r5   r6   r7   r   r8   r   r   r   r<   r>   r@   rA   rA   rA   rB   rC      s    
rC   c                    s6   t  j|i | | jjst  | jd _d S d S )Nr   )	rQ   r   r   r   r   r   r   r9   r   )rK   r   r   rV   rA   rB   r     s   z%MarketingLeadInteractionForm.__init__)r5   r6   r7   rC   r   rf   rA   rA   rV   rB   r      s    r   c                   @   rg   )MarketingReportReviewFormc                   @   s<   e Zd ZeZddgZejddddejddiddZ	d	S )
zMarketingReportReviewForm.Metar   r   r   r   r   r   r   )r   r   N)
r5   r6   r7   r
   r8   r9   r   r<   r:   r@   rA   rA   rA   rB   rC     s    
rC   Nrs   rA   rA   rA   rB   r     rt   r   c                   @   s   e Zd Zejejjdddddej	ddidd	Z
ejdejd
ddddZejdejd
ddddZejdgej dej	ddiddZdS )MarketingReportFilterForm	marketing)role
first_nameFz	All Staffr   r   r   )querysetr   empty_labelr   r   r   r   r   )rZ   zAll Statuses)r   r   r   N)r5   r6   r7   r   ModelChoiceFieldUserrI   filterorder_byr:   staff_member	DateFieldr   	date_fromdate_tor   r
   REPORT_STATUS_CHOICESr   rA   rA   rA   rB   r     s(    

r   c                   @   s   e Zd Zg dZejeejddiddZejdej	ddddd	Z
ejdejdd
ddddZejddejddiddZdS )CustomerServiceManagementForm))suspendzSuspend Service)	reconnectzReconnect Service)
disconnectzPermanently Disconnect)start_trialzStart Trial Period)activate_servicezActivate Paid Servicer   r   r   r   FzReason for actionr   r   zdatetime-localrx   z0Optional: Override suspension/disconnection dater   Trq   )r   r   r   N)r5   r6   r7   ACTION_CHOICESr   r   r:   actionre   r;   reasonDateTimeFieldDateTimeInputoverride_dateBooleanFieldrr   send_notificationrA   rA   rA   rB   r   4  s(    
r   c                       s>   e Zd ZG dd dZdd fdd
Zd
 fdd		Z  ZS )SubAccountFormc                
   @   s   e Zd ZeZg dZejddidejddidejddidejddidej	ddddej
ddidej	dddddZdS )zSubAccountForm.Meta)r   r   r&   r'   r*   r+   r,   r   r   r   r4   r/   N)r5   r6   r7   r   r8   r9   r   r;   r=   r<   r:   r@   rA   rA   rA   rB   rC   R  s    
rC   N)rS   c                   s2   t  j|i | || _|r|j| jd _d S d S )Nr*   )rQ   r   rS   r*   r9   r   )rK   rS   r   r   rV   rA   rB   r   b  s
   zSubAccountForm.__init__Tc                    sD   t  jdd}| jr| j|_d|_| jj|_|r |  |   |S )NFrO   T)rQ   rR   rS   rF   r   rT   )rK   rP   sub_accountrV   rA   rB   rR   i  s   
zSubAccountForm.saverd   )r5   r6   r7   rC   r   rR   rf   rA   rA   rV   rB   r   Q  s    r   N)!djangor   django.contrib.authr   django.utilsr   datetimer   modelsr   r   r	   r
   r   decimalr   django.core.exceptionsr   r   	ModelFormr   rh   PackageFormru   Formrz   r   r   r   r   r   r   r   rA   rA   rA   rB   <module>   s(    g
(.