@ -393,7 +393,19 @@ sub customer_ajax :Chained('customer_list') :PathPart('ajax') :Args(0) {
 
			
		
	
		
			
				
					    my  ( $ self ,  $ c )  =  @ _ ; 
 
			
		
	
		
			
				
					    
 
			
		
	
		
			
				
					    my  $ rs  =  $ c - > stash - > { customer_rs } ;  
 
			
		
	
		
			
				
					    NGCP::Panel::Utils::Datatables:: process ( $ c ,  $ rs ,   $ c - > stash - > { contract_dt_columns } ) ; 
 
			
		
	
		
			
				
					    my  $ contract_dt_col  =  NGCP::Panel::Utils::Datatables:: set_columns ( $ c ,  [ 
 
			
		
	
		
			
				
					        {  name  = >  "id" ,  search  = >  1 ,  title  = >  "#"  } , 
 
			
		
	
		
			
				
					        {  name  = >  "external_id" ,  search  = >  1 ,  title  = >  "External #"  } , 
 
			
		
	
		
			
				
					        {  name  = >  "contact.reseller.name" ,  search  = >  1 ,  title  = >  "Reseller"  } , 
 
			
		
	
		
			
				
					        {  name  = >  "contact.email" ,  search  = >  1 ,  title  = >  "Contact Email"  } , 
 
			
		
	
		
			
				
					        {  name  = >  "billing_mappings.product.name" ,  search  = >  1 ,  title  = >  "Product"  } , 
 
			
		
	
		
			
				
					        {  name  = >  "billing_mappings.billing_profile.name" ,  search  = >  1 ,  title  = >  "Billing Profile"  } , 
 
			
		
	
		
			
				
					        {  name  = >  "status" ,  search  = >  1 ,  title  = >  "Status"  } , 
 
			
		
	
		
			
				
					        {  name  = >  "max_subscribers" ,  search  = >  1 ,  title  = >  "Max Number of Subscribers"  } , 
 
			
		
	
		
			
				
					    ] ) ; 
 
			
		
	
		
			
				
					    push  @ {  $ c - > stash - > { contract_dt_columns }  } ,  
 
			
		
	
		
			
				
					        {  name  = >  "max_subscribers" ,  search  = >  1 ,  title  = >  "Max Number of Subscribers"  } ; 
 
			
		
	
		
			
				
					    NGCP::Panel::Utils::Datatables:: process ( $ c ,  $ rs ,  $ contract_dt_col ) ; 
 
			
		
	
		
			
				
					    $ c - > detach (  $ c - > view ( "JSON" )  ) ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -451,7 +463,7 @@ sub customer_create :Chained('customer_list') :PathPart('create') :Args(0) {
 
			
		
	
		
			
				
					            my  $ schema  =  $ c - > model ( 'DB' ) ; 
 
			
		
	
		
			
				
					            $ schema - > txn_do ( sub  { 
 
			
		
	
		
			
				
					                $ form - > params - > { contact_id }  =  $ form - > params - > { contact } { id } ; 
 
			
		
	
		
			
				
					                delete  $ form - > params - > { cont r act} ; 
 
			
		
	
		
			
				
					                delete  $ form - > params - > { cont act} ; 
 
			
		
	
		
			
				
					                my  $ bprof_id  =  $ form - > params - > { billing_profile } { id } ; 
 
			
		
	
		
			
				
					                delete  $ form - > params - > { billing_profile } ; 
 
			
		
	
		
			
				
					                $ form - > { create_timestamp }  =  $ form - > { modify_timestamp }  =  NGCP::Panel::Utils::DateTime:: current_local ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -495,6 +507,102 @@ sub customer_create :Chained('customer_list') :PathPart('create') :Args(0) {
 
			
		
	
		
			
				
					    $ c - > stash ( form  = >  $ form ) ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					sub  customer_base  :Chained('customer_list') :PathPart('') :CaptureArgs(1) {  
			
		
	
		
			
				
					    my  ( $ self ,  $ c ,  $ contract_id )  =  @ _ ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    unless ( $ contract_id - > is_int )  { 
 
			
		
	
		
			
				
					        NGCP::Panel::Utils::Message - > error ( 
 
			
		
	
		
			
				
					            c  = >  $ c , 
 
			
		
	
		
			
				
					            error  = >  "customer contract id '$contract_id' is not valid" , 
 
			
		
	
		
			
				
					            desc   = >  "Invalid customer contract id" , 
 
			
		
	
		
			
				
					        ) ; 
 
			
		
	
		
			
				
					        NGCP::Panel::Utils::Navigation:: back_or ( $ c ,  $ c - > uri_for ( '/customer' ) ) ; 
 
			
		
	
		
			
				
					    } 
 
			
		
	
		
			
				
					    my  $ contract_rs  =  $ c - > stash - > { customer_rs } ; 
 
			
		
	
		
			
				
					    $ c - > stash - > { contract }  =  $ contract_rs - > find ( $ contract_id ) ; 
 
			
		
	
		
			
				
					    unless ( $ c - > stash - > { contract } )  { 
 
			
		
	
		
			
				
					        NGCP::Panel::Utils::Message - > error ( 
 
			
		
	
		
			
				
					            c  = >  $ c , 
 
			
		
	
		
			
				
					            error  = >  "customer contract id '$contract_id' not found" , 
 
			
		
	
		
			
				
					            desc   = >  "Customer contract id not found" , 
 
			
		
	
		
			
				
					        ) ; 
 
			
		
	
		
			
				
					        NGCP::Panel::Utils::Navigation:: back_or ( $ c ,  $ c - > uri_for ( '/customer' ) ) ; 
 
			
		
	
		
			
				
					    } 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					sub  customer_edit  :Chained('customer_base') :PathPart('edit') :Args(0) {  
			
		
	
		
			
				
					    my  ( $ self ,  $ c )  =  @ _ ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    my  $ contract  =  $ c - > stash - > { contract } ; 
 
			
		
	
		
			
				
					    my  $ posted  =  ( $ c - > request - > method  eq  'POST' ) ; 
 
			
		
	
		
			
				
					    my  $ form ; 
 
			
		
	
		
			
				
					    my  $ params  =  {  $ contract - > get_inflated_columns  } ; 
 
			
		
	
		
			
				
					    $ params - > { contact } { id }  =  delete  $ params - > { contact_id } ; 
 
			
		
	
		
			
				
					    $ params - > { product } { id }  =  $ contract - > billing_mappings - > first - > product_id ; 
 
			
		
	
		
			
				
					    $ params - > { billing_profile } { id }  =  $ contract - > billing_mappings - > first - > billing_profile_id ; 
 
			
		
	
		
			
				
					    $ params  =  $ params - > merge ( $ c - > session - > { created_objects } ) ; 
 
			
		
	
		
			
				
					    if ( $ c - > config - > { features } - > { cloudpbx } )  { 
 
			
		
	
		
			
				
					        $ form  =  NGCP::Panel::Form::Contract::ProductSelect - > new ; 
 
			
		
	
		
			
				
					    }  else  { 
 
			
		
	
		
			
				
					        $ form  =  NGCP::Panel::Form::Contract::Basic - > new ; 
 
			
		
	
		
			
				
					    } 
 
			
		
	
		
			
				
					    $ form - > process ( 
 
			
		
	
		
			
				
					        posted  = >  $ posted , 
 
			
		
	
		
			
				
					        params  = >  $ c - > request - > params , 
 
			
		
	
		
			
				
					        item  = >  $ params 
 
			
		
	
		
			
				
					    ) ; 
 
			
		
	
		
			
				
					    NGCP::Panel::Utils::Navigation:: check_form_buttons ( 
 
			
		
	
		
			
				
					        c  = >  $ c , 
 
			
		
	
		
			
				
					        form  = >  $ form , 
 
			
		
	
		
			
				
					        fields  = >  { 'contact.create'  = >  $ c - > uri_for ( '/contact/create' ) , 
 
			
		
	
		
			
				
					                   'billing_profile.create'   = >  $ c - > uri_for ( '/billing/create' ) } , 
 
			
		
	
		
			
				
					        back_uri  = >  $ c - > req - > uri , 
 
			
		
	
		
			
				
					    ) ; 
 
			
		
	
		
			
				
					    if ( $ posted  &&  $ form - > validated )  { 
 
			
		
	
		
			
				
					        try  { 
 
			
		
	
		
			
				
					            my  $ schema  =  $ c - > model ( 'DB' ) ; 
 
			
		
	
		
			
				
					            $ schema - > txn_do ( sub  { 
 
			
		
	
		
			
				
					                $ form - > params - > { contact_id }  =  $ form - > params - > { contact } { id } ; 
 
			
		
	
		
			
				
					                delete  $ form - > params - > { contact } ; 
 
			
		
	
		
			
				
					                my  $ bprof_id  =  $ form - > params - > { billing_profile } { id } ; 
 
			
		
	
		
			
				
					                delete  $ form - > params - > { billing_profile } ; 
 
			
		
	
		
			
				
					                $ form - > { modify_timestamp }  =  NGCP::Panel::Utils::DateTime:: current_local ; 
 
			
		
	
		
			
				
					                my  $ product_id  =  $ form - > params - > { product } { id } ; 
 
			
		
	
		
			
				
					                delete  $ form - > params - > { product } ; 
 
			
		
	
		
			
				
					                unless ( $ form - > params - > { max_subscribers }  &&  length ( $ form - > params - > { max_subscribers } ) )  { 
 
			
		
	
		
			
				
					                    $ form - > params - > { max_subscribers }  =  undef ; 
 
			
		
	
		
			
				
					                } 
 
			
		
	
		
			
				
					                my  $ old_bprof_id  =  $ contract - > billing_mappings - > first - > billing_profile_id ; 
 
			
		
	
		
			
				
					                say  ">>>>>>>>>>> old bprof_id=$old_bprof_id" ; 
 
			
		
	
		
			
				
					                $ contract - > update ( $ form - > params ) ; 
 
			
		
	
		
			
				
					                if ( $ bprof_id  !=  $ old_bprof_id )  { 
 
			
		
	
		
			
				
					                    $ contract - > billing_mappings - > create ( { 
 
			
		
	
		
			
				
					                        billing_profile_id  = >  $ bprof_id , 
 
			
		
	
		
			
				
					                        product_id  = >  $ product_id , 
 
			
		
	
		
			
				
					                        start_date  = >  NGCP::Panel::Utils::DateTime:: current_local , 
 
			
		
	
		
			
				
					                    } ) ; 
 
			
		
	
		
			
				
					                } 
 
			
		
	
		
			
				
					                
 
			
		
	
		
			
				
					                delete  $ c - > session - > { created_objects } - > { contact } ; 
 
			
		
	
		
			
				
					                delete  $ c - > session - > { created_objects } - > { billing_profile } ; 
 
			
		
	
		
			
				
					                my  $ contract_id  =  $ contract - > id ; 
 
			
		
	
		
			
				
					                $ c - > flash ( messages  = >  [ { type  = >  'success' ,  text  = >  "Customer #$contract_id successfully updated" } ] ) ; 
 
			
		
	
		
			
				
					            } ) ; 
 
			
		
	
		
			
				
					        }  catch ( $ e )  { 
 
			
		
	
		
			
				
					            NGCP::Panel::Utils::Message - > error ( 
 
			
		
	
		
			
				
					                c  = >  $ c , 
 
			
		
	
		
			
				
					                error  = >  $ e , 
 
			
		
	
		
			
				
					                desc   = >  "Failed to update customer contract." , 
 
			
		
	
		
			
				
					            ) ; 
 
			
		
	
		
			
				
					        } 
 
			
		
	
		
			
				
					        NGCP::Panel::Utils::Navigation:: back_or ( $ c ,  $ c - > uri_for ( '/customer' ) ) ; 
 
			
		
	
		
			
				
					    }  
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    $ c - > stash ( edit_flag  = >  1 ) ; 
 
			
		
	
		
			
				
					    $ c - > stash ( form  = >  $ form ) ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					sub  reseller_list  :Chained('contract_list') :PathPart('reseller') :CaptureArgs(0) {  
			
		
	
		
			
				
					    my  ( $ self ,  $ c )  =  @ _ ;