# pagination.py
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
from django.utils.safestring import mark_safe #明确对(HTML)输出一个字符串标记为安全目的。返回的对象可使用一个字符串都是合适的。
class Page:
# 当前所在页面 记录条数统计 页面显示记录数 显示的页面数量
def __init__(self, current_page, data_count, per_page_count=10, pager_num=7):
try:
self.current_page = int(current_page)#当前当前所在页面
except Exception as e:
self.current_page = 1#如果为空就为1
self.data_count = data_count#记录条数统计
self.per_page_count = per_page_count#页面显示记录数
self.pager_num = pager_num#显示的页面数量
#开始的记录数
@property#装饰后 不用加()
def start(self):
return (self.current_page - 1) * self.per_page_count
#结束记录数
@property
def end(self):
return self.current_page * self.per_page_count
#计算当前所有数据 需要的总页面数
@property
def total_count(self):
#商 余 商计算 记录条数统计 页面显示记录数
v, y = divmod(self.data_count, self.per_page_count)
if y:#如果有余数
v += 1#页面数需加1
return v #显示页面的方法函数 base_url为要跳转到的页面 ID
def page_str(self, base_url):
page_list = []#想要显示的页面列表
#当 所有的页面数 小于 想要显示的页面数
if self.total_count < self.pager_num:
#从第一页开始
start_index = 1
#到最后一页
end_index = self.total_count + 1
else:
##当前所在页面数 小于等于 想要显示的页面数的 +1 的一半 ( 总页面数 大于 想要显示的页面数 应对最前面的页面显示)
if self.current_page <= (self.pager_num + 1) / 2:
start_index = 1#第一页面
end_index = self.pager_num + 1#想要显示的页面
else:
#开始页面为选中页面的 前面几页(想要显示页面的+1的一半数, 选中页面保持中间位置 )
start_index = self.current_page - (self.pager_num - 1) / 2
end_index = self.current_page + (self.pager_num + 1) / 2
#如果 当前所在页面数 + 显示页面的 - 1 的一半 大于总页面数,(应对最后面的显示)
if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
start_index = self.total_count - self.pager_num + 1
end_index = self.total_count + 1
#如果当前为1时
if self.current_page == 1:
#上一页不再跳转
prev = '<li><span>共%s条</span><a class="page" href="javascript:void(0);">首页</a>'% (self.data_count,)
else:
prev = '<li><span>共%s条</span><a class="page" href="%s?p=%s">上页</a>' % (self.data_count,base_url, self.current_page - 1,)
page_list.append(prev) #循环 开始显示页面 结束显示页面
for i in range(int(start_index), int(end_index)):
#如果所选中的页面,加CSS样式
if i == self.current_page:
temp = '<li><a class="page active" href="%s?p=%s">%s</a>' % (base_url, i, i)
else:
temp = '<li><a class="page" href="%s?p=%s">%s</a>' % (base_url, i, i)
page_list.append(temp)
#如果当前所在页面 等于 最后的页面
if self.current_page == self.total_count:
#下一页不再跳转
nex = '<li><a class="page" href="javascript:void(0);">未页</a><span>共%s页</span>'% (self.total_count,)
else:
nex = '<li><a class="page" href="%s?p=%s">下页</a><span>共%s页</span>' % (base_url, self.current_page + 1,self.total_count,)
page_list.append(nex) #跳转页面 input框
jump = """
<input type='text' /><a onclick='jumpTo(this, "%s?p=");'>GO</a>
<script>
function jumpTo(ths,base){
var val = ths.previousSibling.value;
location.href = base + val;
}
</script>
""" % (base_url,)
page_list.append(jump)#加入列表
#跳转页面 input框 page_str = mark_safe("".join(page_list))#拼接列表为长字符串
return page_str
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————

# pagination.py

 {#page_str.html#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
<div class="row panel-body">
<ul class="pagination right" style="margin-top: 0">
{{ page_str }}
</ul>
</div>
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}

{#page_str.html#}

 # sales_views.py
# ————————47PerfectCRM实现CRM客户报名流程————————
from django.db import IntegrityError # 主动捕捉错误信息
from django.shortcuts import render # 页面返回
from crm import models # 数据库
from bpm.bpm_auxiliary import bpm_forms # 自定制 forms
from django.contrib.auth.decorators import login_required # 登陆后页面才能访问 # ————————47PerfectCRM实现CRM客户报名流程————————
from django.core.mail import send_mail
# send_mail的参数分别是 邮件标题,邮件内容,发件箱(settings.py中设置过的那个),收件箱列表(可以发送给多个人),失败静默(若发送失败,报错提示我们)
import random
import datetime # 获取时间#登陆过期 # 发送邮件的功能 #验证码#密码
class stmp():
def __init__(self):
self.emaillist = [] # 发送给谁
self.code = None # 验证码#密码 def stmps(self, request, email, msg_mail): # 传参数#页面,session #邮箱,发送给谁 #内容
self.emaillist.append(email) # 将邮箱地址添加到调用Django发送邮件功能
# ——————生成验证码——————
_letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z
_upper_cases = _letter_cases.upper() # 大写字母
_numbers = ''.join(map(str, range(3, 10))) # 数字
chars = ''.join((_letter_cases, _upper_cases, _numbers)) # 变成一条字符串
list = random.sample(chars, 4) # 从一条字符串随机选4个字符变成列表
self.code = ''.join(list) # 列表变字符串
# ——————生成验证码——————
# ——————调用Django发送邮件——————
title = 'PerfectCRM项目自动邮件:%s' % self.code # 邮件标题#防止一样的内容被邮箱屏蔽
send_mail(title, # 邮件标题
msg_mail, # 验证码内容
'perfectcrm@sina.cn', # 发送的邮箱 #根据情况重新配置
self.emaillist, # 接受的邮箱
fail_silently=False, # 静默,抛出异常
)
print('发送邮件成功!没收到要换标题!检查发送邮箱的配置!')
# ——————调用Django发送邮件—————— # ————————47PerfectCRM实现CRM客户报名流程————————
# ————————47PerfectCRM实现CRM客户报名流程————————
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
import random # 随机
import string # 字母 数字
from django.core.cache import cache # 缓存
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码———————— # 报名填写 销售
@login_required # 登陆后页面才能访问
def enrollment(request, customer_id):
msgs = {} # 错误信息
customer_obj = models.Customer.objects.get(id=customer_id) # 取到客户信息记录 #返回到页面#报名人
consultant_obj = models.UserProfile.objects.get(id=request.user.id) # 报名课程顾问 stmp_mail = {} # 邮件发送成功
stmpemail = stmp() # 实例化发送邮件的功能
email = request.POST.get('email') # 让页面POST提交的值,在页面GET后仍然存在显示
if request.method == "POST":
enroll_form = bpm_forms.EnrollmentForm(request.POST) # 获取数据
if enroll_form.is_valid(): # 表单验证 # ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
# msg = "http://127.0.0.1:8000/bpm/customer/registration/{enroll_obj_id}/"
msg = "http://127.0.0.1:8000/bpm/customer/registration/{enroll_obj_id}/{random_str}/ "
random_str = ''.join(random.sample(string.ascii_lowercase + string.digits, 8)) # 生成8位随机字符串 #URL使用
url_str = '''customer/registration/{enroll_obj_id}/{random_str}/''' # 报名链接
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码———————— try:
enroll_form.cleaned_data['customer'] = customer_obj # 添加学员对象 记录 #报名人
enroll_form.cleaned_data['consultant'] = consultant_obj # 报名课程顾问
enroll_obj = models.Enrollment.objects.create(**enroll_form.cleaned_data) # 创建记录 # ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
# msgs['msg']=msg.format(enroll_obj_id=enroll_obj.id)#报名记录对应的id,随机字符串,报名链接
sort_url = enroll_obj.id # 获取报名表对应的ID
cache.set(enroll_obj.id, random_str, 61000) # 加入过期时间 #URL使用 # cache缓存
msgs['msg'] = msg.format(enroll_obj_id=enroll_obj.id, random_str=random_str) # 报名记录对应的id,随机字符串,报名链接
url_str = url_str.format(enroll_obj_id=enroll_obj.id, random_str=random_str) # 报名链接
print(url_str)
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
except IntegrityError as e:
# 取到这条记录
enroll_obj = models.Enrollment.objects.get(customer_id=customer_obj.id,
enrolled_class_id=enroll_form.cleaned_data[
'enrolled_class'].id) # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————
if enroll_obj.contract_agreed:#学员已经同意合同,提交了身份证
#return redirect('/crm/contract_review/%s/'%enroll_obj.id)#跳转到审核页面
return render(request,'bpm_sales/contract_prompt.html',locals())#跳转提示页面
# ————————52PerfectCRM实现CRM客户报名流程学生合同审核———————— enroll_form.add_error('__all__', '记录已经存在,不能重复创建!') # ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
# msgs['msg']=msg.format(enroll_obj_id=enroll_obj.id)#报名记录对应的id
cache.set(enroll_obj.id, random_str, 61000) # 加入过期时间 #URL使用 # cache缓存
msgs['msg'] = msg.format(enroll_obj_id=enroll_obj.id, random_str=random_str) # 报名记录对应的id
url_str = url_str.format(enroll_obj_id=enroll_obj.id, random_str=random_str) # 报名链接
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码———————— if email:
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
# msg_mail = "http://127.0.0.1:8000/bpm/customer/registration/%s" %enroll_obj.id
msg_mail = "http://127.0.0.1:8000/bpm/customer/registration/%s/%s" %(enroll_obj.id,random_str)
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
stmpemail.stmps(request, email, msg_mail) # 发送邮件
stmp_mail['ok'] = "邮件已发送成功!" else:
enroll_form = bpm_forms.EnrollmentForm() # modelform表单
return render(request, 'bpm_sales/enrollment.html', locals())
# ————————47PerfectCRM实现CRM客户报名流程———————— # ————————48PerfectCRM实现CRM客户报名流程学生合同————————
#学员合同签定 # ————————51PerfectCRM实现CRM客户报名流程学生合同上传照片————————
import os
from PerfectCRM import settings
import json
# ————————51PerfectCRM实现CRM客户报名流程学生合同上传照片———————— # ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
from django.shortcuts import HttpResponse #页面返回
# def stu_registration(request,enroll_id):
def stu_registration(request,enroll_id,random_str):
# enroll_obj=models.Enrollment.objects.get(id=enroll_id)#获取报名记录
if cache.get(enroll_id) == random_str: # 判断链接失效了没有
enroll_obj = models.Enrollment.objects.get(id=enroll_id) # 报名记录
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码———————— # ————————51PerfectCRM实现CRM客户报名流程学生合同上传照片————————
enrolled_path='%s/%s/'%(settings.ENROLLED_DATA,enroll_id)#证件上传路径
img_file_len=0 #文件
if os.path.exists(enrolled_path):#判断目录是否存在
img_file_list=os.listdir(enrolled_path)#取目录 下的文件
img_file_len=len(img_file_list)
# ————————51PerfectCRM实现CRM客户报名流程学生合同上传照片———————— # ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证————————
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
if request.method == "POST": # ————————51PerfectCRM实现CRM客户报名流程学生合同上传照片————————
ret=False
data=request.POST.get('data')
if data:#如果有删除动作
del_img_path="%s/%s/%s"%(settings.ENROLLED_DATA,enroll_id,data)#路径
print(del_img_path,'=-=-=-=-=-=')
os.remove(del_img_path)
ret=True
return HttpResponse(json.dumps(ret))
if request.is_ajax():#ajax上传图片 #异步提交
print('ajax上传图片 #异步提交中。。。 ',request.FILES)
enroll_data_dir="%s/%s"%(settings.ENROLLED_DATA,enroll_id)#路径 #重要信息不能放在静态文件中
if not os.path.exists(enroll_data_dir):#如果不存目录
os.makedirs(enroll_data_dir,exist_ok=True)#创建目录
for k,file_obj in request.FILES.items(): #循环字典 #上传的文件
with open("%s/%s"%(enroll_data_dir,file_obj.name),'wb') as f: #打开一个文件#路径#获取文件名
for chunk in file_obj.chunks():#循环写入文件 # chunks块
f.write(chunk) #保存文件
return HttpResponse('上传完成!')
# ————————51PerfectCRM实现CRM客户报名流程学生合同上传照片———————— customer_form = bpm_forms.CustomerForm(request.POST, instance=enroll_obj.customer) # 生成表单验证
if customer_form.is_valid(): # 表单验证通过
customer_form.save() # 保存
enroll_obj.contract_agreed = True # 同意协议
enroll_obj.save() # 保存
status = 1 # 修改报名状态 # 1 已经报名
return render(request, 'bpm_sales/stu_registration.html', locals()) else:
if enroll_obj.contract_agreed == True: # 如果协议已经签订
status = 1 # 修改报名状态 # 1 已经报名
else:
status = 0
customer_form = bpm_forms.CustomerForm(instance=enroll_obj.customer) # 生成表单
# customer_form = bpm_forms.CustomerForm(instance=enroll_obj.customer) # 生成表单
# ————————49PerfectCRM实现CRM客户报名流程学生合同表单验证———————— return render(request,'bpm_sales/stu_registration.html',locals())
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
# ————————48PerfectCRM实现CRM客户报名流程学生合同————————
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码————————
else:
return HttpResponse('链接失效,非法链接,请自重!')
# ————————50PerfectCRM实现CRM客户报名流程学生合同URL随机码———————— # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————
from django.shortcuts import redirect
#查询流程提示页面
def contract_prompt(request,enroll_id):
enroll_obj=models.Enrollment.objects.get(id=enroll_id)#取对象
enroll_form= bpm_forms.EnrollmentForm(instance=enroll_obj)#报名表对象
customers_form= bpm_forms.CustomerForm(instance=enroll_obj.customer)#学员的信息
return render(request,'bpm_sales/contract_prompt.html',locals()) # ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
from bpm.bpm_auxiliary.pagination import Page #分页
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
# #待审核
def not_audit(request):
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
# sign=models.Enrollment.objects.all()#所有的报名表
# print(sign,'sign----->')
sign=models.Enrollment.objects.filter(contract_agreed=True,contract_approved=False).all()#所有的报名表 page = Page(request.GET.get('p', 1), len(sign)) #当前页数 默认为1 #总数量
sign = sign[page.start:page.end] # 切片取当前页的数据
page_str = page.page_str('/bpm/not_audit/') #总页数 传入url
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页———————— return render(request, 'bpm_sales/not_audit.html', locals())# #审核合同
@login_required # 登陆后页面才能访问
def contract_review(request,enroll_id):
enroll_obj=models.Enrollment.objects.get(id=enroll_id)#取对象
contract_review = request.user.name #当前登陆人 #合同审核人
#payment_form=forms.PaymentForm()#生成表单
enroll_form= bpm_forms.EnrollmentForm(instance=enroll_obj)#报名表对象
customer_form= bpm_forms.CustomerForm(instance=enroll_obj.customer)#学员的信息
enrolled_path='%s/%s/'%(settings.ENROLLED_DATA,enroll_id)#证件上传路径
if os.path.exists(enrolled_path):#判断目录是否存在
file_list=os.listdir(enrolled_path)#取目录 下的文件
imgs_one=file_list[0] #图片1
imgs_two=file_list[1] #图片2
if request.method=="POST":
enroll_obj.contract_approved = True # 审核通过
enroll_obj.save() #保存
enroll = models.Enrollment.objects.filter(id=enroll_id).update(contract_review=contract_review)#合同审核人
print('审核通过。。。')
return redirect('/bpm/not_audit/')#跳转到待审核
return render(request, 'bpm_sales/contract_review.html', locals())#
#驳回合同
def enrollment_rejection(request,enroll_id):
enroll_obj=models.Enrollment.objects.get(id=enroll_id)#报名表的对象
enroll_obj.contract_agreed=False#修改学员已经同意核同
enroll_obj.save() #保存
return redirect('/bpm/customer/%s/enrollment/'%enroll_obj.customer.id)#跳转到enrollment_rejection
# ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————

# sales_views.py

 {#not_audit.html#}
{## # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————#}
{% extends 'bpm_master/bpm_sample.html' %}
{% block right-container-content %} {#自定义内容开始 右边页面内容#}
<div class="panel-default">
<div class="panel-body">
<h3>待审核 | <a class="btn btn-info pull" href="http://127.0.0.1:8000/king_admin/crm/customer/">报名 | 查询</a>
</h3>
<table class="table table-striped table-responsive">
<thead>
<tr>
<th>客户名字</th>
<th>客户QQ</th>
<th>手机号码</th>
<th>咨询顾问</th>
<th>所报班级</th>
<th>报名课程顾问</th>
<th>合同审核</th>
<th>日期时间</th>
</tr>
</thead>
<tbody>
{% for foo in sign %}
{# {% if foo.contract_agreed and foo.contract_approved == false %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{# {% if foo.contract_agreed and not foo.contract_approved %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
<tr>
<td><a href="{% url 'contract_review' foo.id %}">{{ foo.customer.name }}</a></td>
<td>{{ foo.customer }}</td>
<td>{{ foo.customer.phone }}</td>
<td>{{ foo.customer.consultant }}</td>
<td>{{ foo.enrolled_class }}</td>
<td>{{ foo.consultant }}</td>
<td>{{ foo.contract_approved }}</td>
<td>{{ foo.date }}</td>
</tr>
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{# {% endif %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{% endfor %}
</tbody>
</table>
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{% include 'bpm_components/page_str.html' %}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
</div>
</div>
{% endblock %}
{## # ————————52PerfectCRM实现CRM客户报名流程学生合同审核————————#}

{#not_audit.html#}

 # financial_views.py
# ————————53PerfectCRM实现CRM客户报名流程缴费————————
from crm import models #数据库
from django.shortcuts import redirect,render #页面返回
from bpm.bpm_auxiliary import bpm_forms #自定制 forms
from django.contrib.auth.decorators import login_required # 登陆后页面才能访问 # ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
from bpm.bpm_auxiliary.pagination import Page #分页
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页———————— # #待缴费
def not_payment(request): # ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
# sign=models.Enrollment.objects.all()#所有的报名表
sign=models.Enrollment.objects.filter(contract_approved=True,Pay_cost=False).all()#所有的报名表 page = Page(request.GET.get('p', 1), len(sign)) #当前页数 默认为1 #总数量
sign = sign[page.start:page.end] # 切片取当前页的数据
page_str = page.page_str('/bpm/not_payment/') #总页数 传入url
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页———————— return render(request, 'bpm_financial/not_payment.html', locals())#
# 已缴费
def already_payment(request): # ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
# sign=models.Enrollment.objects.all()#所有的报名表
sign=models.Enrollment.objects.filter(contract_approved=True,Pay_cost=True).all()#所有的报名表 page = Page(request.GET.get('p', 1), len(sign)) #当前页数 默认为1 #总数量
sign = sign[page.start:page.end] # 切片取当前页的数据
page_str = page.page_str('/bpm/already_payment/') #总页数 传入url
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页———————— return render(request, 'bpm_financial/already_payment.html', locals())#
#缴费视图
@login_required # 登陆后页面才能访问
def payment(request,enroll_id):
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
# sign=models.Payment.objects.all()#所有的报名表#前端对比用户#缴费记录
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
enroll_obj=models.Enrollment.objects.get(id=enroll_id)#取对象
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
sign=models.Payment.objects.filter(customer=enroll_obj.customer).all()#所有的报名表#前端对比用户#缴费记录
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
errors={} #错误信息
if request.method=="POST":
payment_amount=request.POST.get('amount')#缴费金额
consultant = models.UserProfile.objects.get(id=request.user.id) #财务人员 #当前登陆人
if payment_amount:
payment_amount=int(payment_amount) #转数字类型
if payment_amount<500:
errors['err']='缴费金额不得低于500元!'
else: #生成forms
payment_obj=models.Payment.objects.create(
customer=enroll_obj.customer,##客户表 学员
course=enroll_obj.enrolled_class.course,#所报课程
consultant=consultant,# 财务人员
amount=payment_amount,#缴费金额
)
enroll_obj.Pay_cost=True#已缴费
enroll_obj.save() #保存
enroll_obj.customer.status=0#修改报名状态 为已报名#根据数据库
enroll_obj.customer.save() #保存
return redirect('/bpm/not_payment')#客户表
else:
errors['err']='金额不能为空!'
else:
payment_form= bpm_forms.PaymentForm()#生成表单 # ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————
page = Page( request.GET.get( 'p', 1 ), len( sign ) ) # 当前页数 默认为1 #总数量
sign = sign[page.start:page.end] # 切片取当前页的数据
page_str = page.page_str( '/bpm/payment/%s/'%enroll_id ) # 总页数 传入url
# ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页———————— return render(request, 'bpm_financial/payment.html', locals())
# ————————53PerfectCRM实现CRM客户报名流程缴费————————

# financial_views.py

 {#not_audit.html#}
{## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}
{% extends 'bpm_master/bpm_sample.html' %}
{% block right-container-content %} {#自定义内容开始 右边页面内容#}
<div class="panel-default">
<div class="panel-body">
<h3>待缴费 | <a class="btn btn-info pull" href={% url 'already_payment' %}>已缴费</a></h3>
<table class="table table-striped table-responsive">
<thead>
<tr>
<th>客户名字</th>
<th>客户QQ</th>
<th>手机号码</th>
<th>咨询顾问</th> <th>所报班级</th>
<th>报名课程顾问</th>
<th>合同审核</th>
<th>合同状态</th>
<th>日期时间</th>
</tr>
</thead>
<tbody>
{% for foo in sign %}
{# {% if foo.contract_agreed and foo.contract_approved == false %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{# {% if foo.contract_approved and not foo.Pay_cost %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
<tr>
<td><a href="{% url 'payment' foo.id %}">{{ foo.customer.name }}</a></td>
<td>{{ foo.customer }}</td>
<td>{{ foo.customer.phone }}</td>
<td>{{ foo.customer.consultant }}</td> <td>{{ foo.enrolled_class }}</td>
<td>{{ foo.consultant }}</td>
<td>{{ foo.contract_review }}</td>
<td>{{ foo.contract_approved }}</td>
<td>{{ foo.date }}</td>
</tr>
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{# {% endif %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{% endfor %}
</tbody>
</table>
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{% include 'bpm_components/page_str.html' %}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
</div>
</div>
{% endblock %} {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}

{#not_audit.html#}

 {#already_payment.html#}
{## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}
{% extends 'bpm_master/bpm_sample.html' %}
{% block right-container-content %} {#自定义内容开始 右边页面内容#}
<div class="panel-default">
<div class="panel-body">
<h3>已缴费 | <a class="btn btn-success pull" href={% url 'not_payment' %}>待缴费</a></h3>
<table class="table table-striped table-responsive">
<thead>
<tr>
<th>客户名字</th>
<th>客户QQ</th>
<th>手机号码</th>
<th>咨询顾问</th> <th>所报班级</th>
<th>报名课程顾问</th>
<th>合同审核</th>
<th>合同状态</th>
<th>日期时间</th>
</tr>
</thead>
<tbody>
{% for foo in sign %}
{# {% if foo.contract_agreed and foo.contract_approved == false %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{# {% if foo.contract_approved and foo.Pay_cost %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
<tr>
<td><a href="{% url 'payment' foo.id %}">{{ foo.customer.name }}</a></td>
<td>{{ foo.customer }}</td>
<td>{{ foo.customer.phone }}</td>
<td>{{ foo.customer.consultant }}</td> <td>{{ foo.enrolled_class }}</td>
<td>{{ foo.consultant }}</td>
<td>{{ foo.contract_review }}</td>
<td>{{ foo.contract_approved }}</td>
<td>{{ foo.date }}</td>
</tr>
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{# {% endif %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{% endfor %}
</tbody>
</table>
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{% include 'bpm_components/page_str.html' %}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
</div>
</div>
{% endblock %} {## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}

{#already_payment.html#}

 {#payment.html#}
{## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}
{% extends 'bpm_master/bpm_sample.html' %}
{% block right-container-content %} {#自定义内容开始 右边页面内容#}
<div class="panel panel-info">
<h4> 学员缴费:</h4>
</div>
<div id="content">
<form action="" class="form-horizontal col-lg-5" role="form" method="post">{% csrf_token %}
<table>
<div class="form-group">
<label for="inputeEmail4" class="col-sm-3"> 客户名字: </label>
<div class="col-sm-3"> {{ enroll_obj.customer.name }}</div>
</div>
<div class="form-group">
<label for="inputeEmail4" class="col-sm-3"> 客户QQ: </label>
<div class="col-sm-3"> {{ enroll_obj.customer }}</div>
</div>
<div class="form-group">
<label for="inputeEmail4" class="col-sm-3"> 手机号码: </label>
<div class="col-sm-3"> {{ enroll_obj.customer.phone }}</div>
</div>
<div class="form-group">
<label for="inputeEmail4" class="col-sm-3">咨询顾问 : </label>
<div class="col-sm-3"> {{ enroll_obj.customer.consultant }} </div>
</div>
<div class="form-group">
<label for="inputeEmail4" class="col-sm-3"> 所报课程 : </label>
<div class="col-sm-3"> {{ enroll_obj.enrolled_class }} </div>
</div>
<div class="form-group">
<label for="inputeEmail4" class="col-sm-3">报名课程顾问 : </label>
<div class="col-sm-3"> {{ enroll_obj.consultant }} </div>
</div>
<div class="form-group">
<label for="inputeEmail4" class="col-sm-3">合同审核 : </label>
<div class="col-sm-3"> {{ enroll_obj.contract_review }} </div>
</div>
<div class="form-group">
<label for="inputeEmail9" class="col-sm-3">缴费金额 :</label>
<div><input type="text" name="amount" placeholder="至少不低于500">
<span style="color: #c7254e">{{ errors.err }}</span>
</div>
</div>
<div class="form-group">
<label for="inputeEmail9" class="col-sm-3">财务人员 :</label>
<div class="col-sm-3"> {{ request.user.name }} </div>
</div>
</table>
<div class="form-group col-sm-6">
<a class="btn btn-danger pull " href={% url 'not_payment' %}>返回</a>
<input type="submit" class="btn btn-success pull-right " value="缴费">
</div>
</form> <hr>
<table class="table table-striped table-responsive">
<thead>
<tr>
<th>客户名字</th>
<th>客户QQ</th>
<th>手机号码</th>
<th>咨询顾问</th>
<th>所报课程</th> <th>报名课程顾问</th>
<th>合同审核</th> <th>缴费金额</th>
<th>财务人员</th>
<th>日期时间</th>
</tr>
</thead>
<tbody>
{% for foo in sign %}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{# {% if foo.customer == enroll_obj.customer %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
<tr>
<td>{{ foo.customer.name }}</td>
<td>{{ foo.customer }}</td>
<td>{{ foo.customer.phone }}</td>
<td>{{ foo.customer.consultant }}</td>
<td>{{ foo.course }}</td> <td>{{ enroll_obj.consultant }}</td>
<td>{{ enroll_obj.contract_review }}</td> <td>{{ foo.amount }}</td>
<td>{{ foo.consultant }}</td>
<td>{{ foo.date }}</td>
</tr>
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{# {% endif %}#}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{% endfor %}
</tbody>
</table> {## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#}
{% include 'bpm_components/page_str.html' %}
{## ————————68PerfectCRM实现CRM业务流程(bpm)报名缴费分页————————#} </div>
{% endblock %}
{## # ————————53PerfectCRM实现CRM客户报名流程缴费————————#}

{#payment.html#}

Django项目:CRM(客户关系管理系统)--78--68PerfectCRM实现CRM业务流程(bpm)报名缴费分页的更多相关文章

  1. Django项目:CRM(客户关系管理系统)--84--74PerfectCRM实现CRM权限和权限组限制访问URL

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

  2. Django项目:CRM(客户关系管理系统)--85--75PerfectCRM实现CRM扩展权限

    # sales_urls.py # ————————47PerfectCRM实现CRM客户报名流程———————— from django.conf.urls import url from bpm. ...

  3. Django CRM客户关系管理系统

    CRM需求分析 随着信息化时代带来的科技创新,CRM客户关系管理系统带来的效益在已经成为很多企业提高竞争优势的一分部,CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现 ...

  4. Django项目:CRM(客户关系管理系统)--80--70PerfectCRM实现CRM业务流程(bpm)课程排行分页

    # coursetop_views.py # ————————64PerfectCRM实现CRM课程排名详情———————— #————班级学生详情——#计算#{学员ID:分数}——#计算 #{学员I ...

  5. Django项目:CRM(客户关系管理系统)--79--69PerfectCRM实现CRM业务流程(bpm)学生讲师分页

    # student_views.py # ————————60PerfectCRM实现CRM学生上课记录———————— from django.shortcuts import render #页面 ...

  6. CRM 客户关系管理系统

    CRM(Customer Relationship Manager)客户关系管理系统 企业为提高核心竞争力,利用相应的信息技术以及互联网技术协调企业与顾客间在销售.营销和服务上的交互,从而提升其管理方 ...

  7. CRM客户关系管理系统-需求概设和详设

    大概设计 大概设计就是对需求进行一个整体性分析,把需要实现的功能都列出来,对于客户关系管理系统,我们需要从角色出发,从而确定有哪些需求,最好是画个思维导图 首先我们是为培训学校这么一个场景来开发的,所 ...

  8. CRM客户关系管理系统 北京易信软科信息技术有限公司

    北京易信软科信息技术有限公司 推出大型erp系统,库存管理系统,客户关系管理系统,车辆登记管理系统,员工管理系统,采购管理系统,销售管理系统,为您的企业提供最优质的产品服务 北京易信软科您可信赖的北京 ...

  9. Django项目:CRM(客户关系管理系统)--82--72PerfectCRM实现CRM动态菜单和角色

    #models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...

随机推荐

  1. elasticsearch+filebeat+kibana提取多行日志

    filebeat的配置文件filebeat.yml以下三行去掉注释 multiline.pattern: ^\[ multiline.negate: true //false改为true multil ...

  2. python使用PIL处理图片后返回给前端的坑

    一.python代码 这里有个坑,之前没有将bytes图片数据转成base64就返回到前端了,但在前端处理的时候,怎么都显示不出图片来,虽然数据拿到了,但bytes被传到前后变str了,所以怎么搞都没 ...

  3. 牛客多校第六场 B Shorten IPv6 Address 模拟

    题意: 给你一个二进制表示的IPv6地址,让你把它转换成8组4位的16进制,用冒号分组的表示法.单组的前导0可以省略,连续多组为0的可以用两个冒号替换,但是只允许替换一次.把这个地址通过这几种省略方式 ...

  4. 怎么规划一个零基础学习Unity3D的“方法”或者“流程”?

    具体出处:https://www.zhihu.com/question/35542990 我只是一个计算机相关专业毕业的,已经掌握了基础的C#并开发过.net的.目前突然心血来潮对unity3D有兴趣 ...

  5. day 54 Django基础四之模板系统

    Django基础四之模板系统   本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关于模 ...

  6. 面试系列16 redis的持久化

    1.RDB和AOF两种持久化机制的介绍 RDB持久化机制,对redis中的数据执行周期性的持久化 AOF机制对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的 ...

  7. mysql commond record

    CREATE DATABASE IF NOT EXISTS codex_gm DEFAULT CHARACTER SET utf8; service mysqld stop screen -dmS m ...

  8. python3 使用aria2下载的一个脚本

    import requests import time ariaurl="http://localhost:6800/jsonrpc" dlurl="http://xxx ...

  9. css,js文件后面加一个版本号

    由于前几天,更新了项目,更新的文件有js文件,今天客人截图过来,我发现修改之后的效果没有显示出来,我回复说清理浏览器缓存.到了晚上,客人找老板,说还没有处理到這个,说客人不懂這个.所以想到之前自己为了 ...

  10. ansible 安装及基本使用

    1.yum 安装 yum -y install epel-releaseyum -y install ansible ansible 配置秘钥 ssh-keygen -t rsa #直接回车不用设置密 ...