o
    'h%3                     @   s   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
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dS )    )models)get_user_model)timezone)InvoiceDecimalNc                       s,  e Zd Zg dZg dZ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ddZejdedZejdeddZejdddZejdddZejdddZejdddZejeejddddZejdddZejdddZejddZejddZejdddZ fddZ dd Z!  Z"S )Payment))mpesazM-Pesa)cashCash)bank_transferzBank Transfer)chequeCheque)balance_deductionzAccount Balance Deduction))pendingPending)	completed	Completed)failedFailed)	cancelled	Cancelled2   T
max_lengthuniquepayments)	on_deleterelated_namenullblankcustomers.Customerz-For advance payments without specific invoice)r   r   r   r    	help_text
      
max_digitsdecimal_places   r   choicesr   r   r*   defaultr   r       r   r    cash_payments_received)r   r   r    r   d   )r    auto_now_addc                    sD   | j sdd l}dt| d d   | _ t j|i | d S )Nr   zPAY-   )
payment_iduuidstruuid4uppersupersave)selfargskwargsr6   	__class__ //var/www/html/optinet_system/payments/models.pyr;   3   s    zPayment.savec                 C   s   d| j  d| j d|   S )NzPayment  - )r5   amountget_status_displayr<   rA   rA   rB   __str__:      zPayment.__str__)#__name__
__module____qualname__PAYMENT_METHOD_CHOICESSTATUS_CHOICESr   	CharFieldr5   
ForeignKeyr   CASCADEinvoicecustomerDecimalFieldrD   payment_methodstatusmpesa_receipt_numbermpesa_transaction_idmpesa_phone_number	JSONFieldmpesa_callback_dataUserSET_NULLcash_received_bycash_receipt_numberreference_number	TextFieldnotesDateTimeField
created_atcompleted_atr;   rG   __classcell__rA   rA   r?   rB   r      s*    r   c                   @   s   e Zd ZejdddZejddZejdddZejddZ	ejddZ
ejd	dZejd
ddZejdddZejdddZejd	ddZejeejdddZejddZdd ZdS )MpesaTransactionr1   Tr   r   r#   r$   r%   r.      r   r-   r/   r   r   r    r2   c                 C      d| j  d| j S )NzM-Pesa rC   )checkout_request_idrD   rF   rA   rA   rB   rG   N      zMpesaTransaction.__str__N)rI   rJ   rK   r   rN   rk   merchant_request_idrS   rD   phone_numberaccount_referencetransaction_descrV   rb   transaction_dateIntegerFieldresult_coderesult_descrO   r   r\   paymentrc   rG   rA   rA   rA   rB   rf   =   s    rf   c                   @   s  e Zd Zg dZejdddZejddZejdedZej	dd	d
Z
ejddZejddZejdddZejdddZejdddZejdddZejdddZej	dd	dddZej	dd	dddZej	dd	dddZej	dd	dddZejddZejddZejdddZdd ZdS )MpesaB2CTransaction))SalaryPaymentzSalary Payment)BusinessPaymentzBusiness Payment)PromotionPaymentzPromotion Paymentr1   Tr   rg   r(   r)   r#   r$   r%   r.   rh   r-   r/   r   r&   r'   r   r    F)r,   r2   c                 C      d| j  d| j d| j S )NzB2C rC    to )conversation_idrD   rn   rF   rA   rA   rB   rG   n      zMpesaB2CTransaction.__str__N)rI   rJ   rK   COMMAND_CHOICESr   rN   r}   originator_conversation_id
command_idrS   rD   rn   remarksoccasionrr   rs   rt   transaction_idtransaction_receipttransaction_amountworking_account_fundsutility_account_fundscharges_paid_fundsBooleanFieldrecipient_registeredrb   rc   rd   rG   rA   rA   rA   rB   rv   Q   s*    rv   c                   @   s  e Zd Zg dZejdddZejddZejdedZej	dd	d
Z
ejddZejddZejddZejddZejdddZejdddZejdddZejdddZej	dd	dddZej	dd	dddZej	dd	dddZej	dd	dddZejddZejdddZdd ZdS )MpesaB2BTransaction))BusinessPayBillzBusiness Pay Bill)BusinessBuyGoodszBusiness Buy Goods)DisburseFundsToBusinesszDisburse Funds To Business)BusinessToBusinessTransferzBusiness To Business Transferr1   Tr   rg      r)   r#   r$   r%   r(   rh   r/   r-   r   rz   r2   c                 C   s$   d| j  d| j d| j d| j S )NzB2B rC   z from r|   )r}   rD   party_aparty_brF   rA   rA   rB   rG      s   $zMpesaB2BTransaction.__str__N)rI   rJ   rK   r   r   rN   r}   r   r   rS   rD   r   r   ro   r   rr   rs   rt   r   r   r   r   r   r   rb   rc   rd   rG   rA   rA   rA   rB   r   q   s*    r   c                   @   s  e Zd ZejdddZejddZejddZejdddZ	ejd	dZ
ejd
dZejdddZejdddZejd
ddZejdddZejdddZejdddddZejdddddZejdddddZejdddddZejddZejdddZdd ZdS )MpesaReversalr1   Tr   rg   r   r#   r$   r%   r(   rh   r-   r/   rz   r2   c                 C   r{   )Nz	Reversal rC   z for )r}   rD   original_transaction_idrF   rA   rA   rB   rG      r~   zMpesaReversal.__str__N)rI   rJ   rK   r   rN   r}   r   r   rS   rD   receiver_partyr   r   rr   rs   rt   r   r   r   r   r   r   rb   rc   rd   rG   rA   rA   rA   rB   r      s&    r   c                   @   s   e Zd ZejdddZejddZejdddZejdddZ	ej
dd	ddd
Zej
dd	ddd
Zej
dd	ddd
ZejddZejdddZdd ZdS )MpesaBalanceInquiryr1   Tr   rg   r/   rh   r-   r.   r$   rz   r2   c                 C   rj   )NzBalance Inquiry rC   )r}   rc   rF   rA   rA   rB   rG      rl   zMpesaBalanceInquiry.__str__N)rI   rJ   rK   r   rN   r}   r   rr   rs   rt   rS   r   r   r   rb   rc   rd   rG   rA   rA   rA   rB   r      s    r   c                   @   s<  e Zd Zg dZg dZejdddZejddZej	dd	d
Z
ejdddZe ZejdddZejdddZejdddZejdeddZejdeddZejdddZejdejddddZejeejdddZejdddZejdddZejddZejddZG dd dZdd Z e!d d! Z"d&d#d$Z#d%S )'UnreconciledPayment))invalid_accountzInvalid Account Number)account_not_foundzAccount Number Not Found)duplicate_transactionzDuplicate Transaction)invalid_amountzInvalid Amount)system_errorzSystem Error))r   zPending Review)resolvedResolved)refundedRefunded)ignoredIgnoredr   Tr   r.   rg   r#   r$   r%   r1   z+The account number customer tried to pay to)r   r"   r-      r   r+   r   z+Admin notes about this unreconciled payment)r    r"   r!   z0Customer this payment was eventually assigned to)r   r   r    r"   ri   r/   r2   )auto_nowc                   @   s   e Zd ZdgZdS )zUnreconciledPayment.Metaz-created_atN)rI   rJ   rK   orderingrA   rA   rA   rB   Meta   s    
r   c                 C   s   d| j  d| j d| j dS )NzUnreconciled: z - KES z ())r   rD   ro   rF   rA   rA   rB   rG      rH   zUnreconciledPayment.__str__c                 C   s   | j  d| j d| j  S )N )
first_namemiddle_name	last_namestriprF   rA   rA   rB   customer_name   s   z!UnreconciledPayment.customer_name c                 C   s   ddl m} | j}|rt|rt|}tjj|| j	dd| j
| jd| j
 d| j d|  |p5t d	}dd	lm} |j|| j	d
| j
 |j|d d| _|| _|| _t | _|ri| j d|  | _|   |S )z8Resolve this unreconciled payment to a specific customerr   r   r	   r   z	RESOLVED-z5Resolved unreconciled payment. Original account ref: z. )	rR   rD   rT   rU   rV   rX   r_   ra   rd   )CustomerBalanceServicezResolved M-Pesa payment - )rR   rD   descriptionreference_idprocessed_byr   
)decimalr   transaction_timer   is_naive
make_awarer   objectscreaterD   r   rn   ro   r   nowcustomers.servicesr   add_balancer5   rU   resolved_customerresolved_byresolved_atra   r;   )r<   rR   resolved_by_userra   r   r   ru   r   rA   rA   rB   resolve_to_customer   s>   



	
z'UnreconciledPayment.resolve_to_customerN)r   )$rI   rJ   rK   REASON_CHOICESrM   r   rN   r   rn   rS   rD   ro   rb   r   r   r   r   reasonrU   r`   ra   rO   r\   r   r[   r   r   rY   callback_datarc   
updated_atr   rG   propertyr   r   rA   rA   rA   rB   r      s2    
r   )	django.dbr   django.contrib.authr   django.utilsr   billing.modelsr   r   r   r6   r[   Modelr   rf   rv   r   r   r   r   rA   rA   rA   rB   <module>   s   2 !