educode_sales 1.10.49 → 1.10.59

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/educode_sales/modules/easyeditor/easyeditor.css +1 -1
  3. data/app/controllers/educode_sales/application_controller.rb +10 -0
  4. data/app/controllers/educode_sales/business_courses_controller.rb +58 -33
  5. data/app/controllers/educode_sales/businesses_controller.rb +43 -7
  6. data/app/controllers/educode_sales/contracts_controller.rb +6 -0
  7. data/app/controllers/educode_sales/money_plan_records_controller.rb +6 -2
  8. data/app/controllers/educode_sales/money_plans_controller.rb +3 -0
  9. data/app/controllers/educode_sales/plans_controller.rb +392 -9
  10. data/app/controllers/educode_sales/sale_trends_controller.rb +1 -1
  11. data/app/controllers/educode_sales/shixun_dectects_controller.rb +77 -16
  12. data/app/controllers/educode_sales/shixuns_controller.rb +65 -4
  13. data/app/controllers/educode_sales/subject_trends_controller.rb +99 -892
  14. data/app/controllers/educode_sales/subjects_controller.rb +29 -18
  15. data/app/helpers/educode_sales/application_helper.rb +3 -1
  16. data/app/helpers/educode_sales/business_courses_helper.rb +29 -6
  17. data/app/helpers/educode_sales/sale_trends_helper.rb +52 -52
  18. data/app/helpers/educode_sales/subject_helper.rb +5 -1
  19. data/app/models/educode_sales/business.rb +5 -5
  20. data/app/models/educode_sales/business_deliver_subject.rb +3 -2
  21. data/app/models/educode_sales/business_subject.rb +9 -3
  22. data/app/models/educode_sales/business_subject_shixun.rb +37 -8
  23. data/app/models/educode_sales/business_subject_staff.rb +1 -0
  24. data/app/models/educode_sales/permission.rb +7 -0
  25. data/app/models/educode_sales/sales_target_history.rb +11 -0
  26. data/app/views/educode_sales/business_courses/edit.html.erb +30 -4
  27. data/app/views/educode_sales/business_courses/index.html.erb +34 -12
  28. data/app/views/educode_sales/business_courses/index.json.jbuilder +2 -2
  29. data/app/views/educode_sales/business_courses/list_shixuns.html.erb +132 -64
  30. data/app/views/educode_sales/business_courses/list_shixuns.json.jbuilder +12 -6
  31. data/app/views/educode_sales/business_courses/list_subjects.html.erb +29 -34
  32. data/app/views/educode_sales/business_courses/list_subjects.json.jbuilder +7 -2
  33. data/app/views/educode_sales/business_courses/new.html.erb +45 -20
  34. data/app/views/educode_sales/businesses/index.html.erb +11 -9
  35. data/app/views/educode_sales/contracts/_list.html.erb +16 -1
  36. data/app/views/educode_sales/contracts/index.html.erb +5 -2
  37. data/app/views/educode_sales/contracts/list.js.erb +4 -1
  38. data/app/views/educode_sales/money_plan_records/_index.html.erb +21 -5
  39. data/app/views/educode_sales/money_plan_records/index.js.erb +4 -1
  40. data/app/views/educode_sales/money_plans/list.html.erb +6 -2
  41. data/app/views/educode_sales/plans/_year_execute.html.erb +293 -0
  42. data/app/views/educode_sales/plans/_year_target.html.erb +677 -0
  43. data/app/views/educode_sales/plans/index.html.erb +104 -81
  44. data/app/views/educode_sales/plans/year_execute.js.erb +1 -0
  45. data/app/views/educode_sales/plans/year_target.js.erb +1 -0
  46. data/app/views/educode_sales/plans/year_target.json.jbuilder +48 -0
  47. data/app/views/educode_sales/plans/years_all_target.json.jbuilder +53 -0
  48. data/app/views/educode_sales/sale_trends/_return_money_forecast.html.erb +1 -1
  49. data/app/views/educode_sales/sale_trends/_user_stat.html.erb +1 -1
  50. data/app/views/educode_sales/sale_trends/_visit_analysis.html.erb +1 -1
  51. data/app/views/educode_sales/sale_trends/return_money_forecast.js.erb +1 -1
  52. data/app/views/educode_sales/sale_trends/trends.html.erb +6 -6
  53. data/app/views/educode_sales/sale_trends/user_stat.js.erb +1 -1
  54. data/app/views/educode_sales/sale_trends/visit_analysis.js.erb +1 -1
  55. data/app/views/educode_sales/shixun_dectects/index.html.erb +97 -47
  56. data/app/views/educode_sales/shixun_dectects/index.json.jbuilder +4 -3
  57. data/app/views/educode_sales/shixun_dectects/markdown.html.erb +1 -1
  58. data/app/views/educode_sales/shixuns/edit.html.erb +35 -13
  59. data/app/views/educode_sales/shixuns/index.html.erb +348 -138
  60. data/app/views/educode_sales/shixuns/index.json.jbuilder +9 -5
  61. data/app/views/educode_sales/shixuns/new.html.erb +22 -12
  62. data/app/views/educode_sales/subject_trends/trends.html.erb +177 -575
  63. data/app/views/educode_sales/subjects/edit.html.erb +4 -4
  64. data/app/views/educode_sales/subjects/index.html.erb +50 -12
  65. data/app/views/educode_sales/subjects/index.json.jbuilder +3 -3
  66. data/app/views/educode_sales/subjects/list_shixuns.html.erb +143 -17
  67. data/app/views/educode_sales/subjects/list_shixuns.json.jbuilder +9 -4
  68. data/app/views/educode_sales/subjects/new.html.erb +4 -4
  69. data/app/views/layouts/educode_sales/application.html.erb +2 -2
  70. data/config/routes.rb +7 -2
  71. data/db/migrate/20230729085359_create_educode_sales_sales_target_histories.rb +45 -0
  72. data/lib/educode_sales/version.rb +1 -1
  73. metadata +10 -4
  74. data/app/views/educode_sales/plans/_target_track.html.erb +0 -178
  75. data/app/views/educode_sales/plans/target_track.js.erb +0 -1
@@ -2,7 +2,7 @@ require_dependency "educode_sales/application_controller"
2
2
 
3
3
  module EducodeSales
4
4
  class PlansController < ApplicationController
5
-
5
+ protect_from_forgery
6
6
  def index
7
7
  # authorize! :read, SalePlan
8
8
  respond_to do |format|
@@ -93,7 +93,7 @@ module EducodeSales
93
93
  render_failure plan
94
94
  end
95
95
  end
96
-
96
+
97
97
  end
98
98
 
99
99
  def create_business_info
@@ -112,7 +112,7 @@ module EducodeSales
112
112
  common = Common.find_by(clazz: 'staff_type', name: '销售')
113
113
  @staffs = Staff.includes(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id] }
114
114
 
115
-
115
+
116
116
  @week = Time.now.strftime('%W').to_i
117
117
  week = Time.now.strftime('%W').to_i
118
118
  if week > 3
@@ -153,7 +153,7 @@ module EducodeSales
153
153
  @commons = Common.where(clazz: '计划类型').pluck(:name, :id)
154
154
  common = Common.find_by(clazz: 'staff_type', name: '销售')
155
155
  @staffs = Staff.includes(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id] }
156
-
156
+
157
157
  @business = Business.find_by(id: params[:business_id])
158
158
  business_ids = EducodeSales::AssignFollowUp.joins(:follow_up).where(staff_id: @current_admin.id).pluck :business_id
159
159
  @businesses =Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
@@ -181,7 +181,7 @@ module EducodeSales
181
181
  @businesses = @businesses.limit(10)
182
182
  end
183
183
  @businesses = @businesses.order(created_at: :desc)
184
-
184
+
185
185
  @businesses = @businesses.map { |b| {name: b.name + "(#{b.department&.school&.name} #{b.department&.name})" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), value: b.id} }
186
186
  render json: { data: @businesses, code: 0, msg: "success" }
187
187
  end
@@ -233,7 +233,7 @@ module EducodeSales
233
233
  business_ids << @sale_plan.business_id
234
234
  @businesses = Business.includes(:department, :last_follow_up).where("educode_sales_businesses.id in (?) or educode_sales_businesses.staff_id = ?", business_ids, @current_admin.id).order(created_at: :desc)
235
235
  @businesses = @businesses.map { |b| [b.name + "(" + b.department&.school&.name.to_s + ")" + "---" + "最新跟进:" + (b.last_follow_up.present? ? b.last_follow_up.created_at.to_s : b.created_at.to_s), b.id] }
236
-
236
+
237
237
  if @sale_plan.weekly.present?
238
238
  week = Time.now.strftime('%W').to_i
239
239
  if week > 3
@@ -389,6 +389,51 @@ module EducodeSales
389
389
  @sale_plans = @sale_plans.page(params[:page]).per(params[:limit])
390
390
  end
391
391
 
392
+ def years_all_target
393
+ #目标类别
394
+ target_clazz = params[:target_clazz]
395
+ #年份
396
+ year = params[:year].present? ? params[:year].to_i : Date.today.year.to_i
397
+ type = params[:type]
398
+ #员工id
399
+ staff_id = params[:staff_id]
400
+ #客户类型
401
+ school_tag_id = params[:school_tag_id]
402
+
403
+ if @current_admin.is_admin?
404
+ else
405
+ level = @current_admin.role.role_areas.find_by(clazz: '销售计划').level
406
+ case level
407
+ when '自己'
408
+ staff_id = @current_admin.id
409
+ when '区域'
410
+ staff_id = @current_admin.id
411
+ else
412
+ end
413
+ end
414
+
415
+ if type.present? && type == 'all'
416
+ @data = get_sales_all_plan(0, '', year, school_tag_id)
417
+ @total_count = 1
418
+ else
419
+ staffs =
420
+ if staff_id.present?
421
+ EducodeSales::Staff.where(id: staff_id)
422
+ else
423
+ EducodeSales::Staff.all
424
+ end
425
+ @total_count = staffs.count
426
+ staffs = staffs.page(params[:page]).per(params[:limit])
427
+ @data = []
428
+ staffs.each do |staff|
429
+ @data += get_sales_all_plan(staff.id, staff.name, year, school_tag_id)
430
+ end
431
+ end
432
+ if target_clazz.present?
433
+ @data.delete_if { |item| !target_clazz.include?(item['target_clazz'])}
434
+ end
435
+ end
436
+
392
437
  def my_years_plan
393
438
  @sale_plans = SalePlan.where(staff_id: @current_admin.id)
394
439
  end
@@ -511,19 +556,183 @@ module EducodeSales
511
556
  end
512
557
 
513
558
 
514
- def target_track
559
+ def year_execute
560
+ respond_to do |format|
561
+ format.html do
562
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
563
+ @staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
564
+ gon.school_tags = SchoolTag.where(for_missions: true).map { |d| {value: d.id, name: d.name } }
565
+ end
566
+ format.js do
567
+ common = Common.find_by(clazz: 'staff_type', name: '销售')
568
+ @staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
569
+ gon.school_tags = SchoolTag.where(for_missions: true).map { |d| {value: d.id, name: d.name } }
570
+ end
571
+ end
572
+ end
573
+
574
+ def year_target
515
575
  respond_to do |format|
516
576
  format.html do
517
-
518
577
  end
519
578
  format.js do
520
579
  common = Common.find_by(clazz: 'staff_type', name: '销售')
521
580
  @staffs = Staff.joins(:user).where(job_type: common.id).map { |d| [d.user.real_name, d.id]}
522
581
  gon.school_tags = SchoolTag.where(for_missions: true).map { |d| {value: d.id, name: d.name } }
582
+ gon.month = Time.now.month
583
+ end
584
+ format.json do
585
+
586
+ if @current_admin.is_admin?
587
+ @data = EducodeSales::SalesTargetHistory.all
588
+ else
589
+ level = @current_admin.role.role_areas.find_by(clazz: '销售计划').level
590
+ case level
591
+ when '自己'
592
+ @data = EducodeSales::SalesTargetHistory.where(staff_id: @current_admin.id)
593
+ when '区域'
594
+ @data = EducodeSales::SalesTargetHistory.all
595
+ staff_ids = Staff.joins(user: [user_extension: [department: :school]]).where("schools.province in (?)", @current_admin.areas.pluck(:name)).pluck(:id)
596
+ @data = @data.where(staff_id: staff_ids)
597
+ else
598
+ @data = EducodeSales::SalesTargetHistory.all
599
+ end
600
+ end
601
+ @data = @data.order("staff_id asc,num desc, is_use desc,field(state, 1,0,2), id desc")
602
+ if params[:year].present?
603
+ @data = @data.where(year: params[:year])
604
+ end
605
+ if params[:school_tag_id].present?
606
+ @data = @data.where(school_tag_id: params[:school_tag_id])
607
+ end
608
+ if params[:staff_id].present?
609
+ @data = @data.where(staff_id: params[:staff_id])
610
+ end
611
+ if params[:year_target].present?
612
+ @data = @data.where(year_target: params[:year_target])
613
+ end
614
+ if params[:target_clazz].present?
615
+ @data = @data.where(target_clazz: params[:target_clazz])
616
+ end
617
+ @data = @data.page(params[:page]).per(params[:limit])
523
618
  end
524
619
  end
525
620
  end
526
621
 
622
+ def cal_finish_amount
623
+ start_at = params[:year] + "-01-01"
624
+ end_at = params[:year] + "-12-31"
625
+ amount = 0
626
+ case params[:target_clazz]
627
+ when "回款"
628
+ # 对应销售经理下回款时间的回款金额
629
+ amount = EducodeSales::MoneyPlanRecord.joins("
630
+ LEFT JOIN educode_sales_follow_ups AS last_follow_up ON educode_sales_businesses.last_follow_up_id = last_follow_up.id AND last_follow_up.deleted_at IS NULL
631
+ LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = last_follow_up.id").
632
+ joins(business: [department: [school: :school_tags]]).where("school_tags.id = ?", params[:school_tag_id]).
633
+ where("(educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = ?) OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = ?)", params[:staff_id], params[:staff_id]).
634
+ where("date_at >= ? AND date_at <= ?", start_at, end_at).sum("amount")
635
+
636
+ when '商机'
637
+ a_clazz = EducodeSales::Common.find_by(extras: 'a_class')
638
+ start_at = "#{params[:year]}-01-01 00:00:01"
639
+ end_at = "#{params[:year]}-12-31 23:59:59"
640
+ staff_id = params[:staff_id]
641
+ # 对应销售经理下A类商机预算金额
642
+ amount = EducodeSales::Business.from("(
643
+ SELECT distinct educode_sales_businesses.id, last_follow_up.budget_amount, educode_sales_businesses.deleted_at, educode_sales_businesses.department_id
644
+ FROM educode_sales_businesses
645
+ JOIN educode_sales_follow_ups ON educode_sales_follow_ups.business_id = educode_sales_businesses.id AND educode_sales_businesses.clazz_id = #{a_clazz.id}
646
+ AND educode_sales_follow_ups.created_at > '#{start_at}' AND educode_sales_follow_ups.created_at < '#{end_at}'
647
+ JOIN educode_sales_follow_ups AS last_follow_up ON educode_sales_businesses.last_follow_up_id = last_follow_up.id AND last_follow_up.deleted_at IS NULL AND last_follow_up.clazz_id = #{a_clazz.id}
648
+ LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = last_follow_up.id
649
+ WHERE (educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = '#{staff_id}') OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = '#{staff_id}')
650
+ ) AS educode_sales_businesses
651
+ ").joins(department: [school: :school_tags]).where("school_tags.id = ?", params[:school_tag_id]).sum(:budget_amount)
652
+ when '中标'
653
+ # 对应销售经理下合同列表的中标时间下合同金额
654
+ contract_ids = EducodeSales::Common.where(clazz: '商机阶段', name: ['已中标', '已签单', '已验收', '回款中', '服务中', '已结束']).pluck(:id)
655
+ businesses = EducodeSales::Business.joins("
656
+ JOIN educode_sales_follow_ups ON educode_sales_businesses.last_follow_up_id = educode_sales_follow_ups.id
657
+ ").joins("LEFT JOIN educode_sales_assign_follow_ups ON educode_sales_assign_follow_ups.follow_up_id = educode_sales_businesses.last_follow_up_id").
658
+ joins(department: [school: :school_tags]).where("school_tags.id = ?", params[:school_tag_id]).
659
+ where("(educode_sales_assign_follow_ups.id IS NOT NULL AND educode_sales_assign_follow_ups.staff_id = ?) OR (educode_sales_assign_follow_ups.id IS NULL AND educode_sales_businesses.staff_id = ?)", params[:staff_id], params[:staff_id]).
660
+ where("educode_sales_follow_ups.stage_id in (?)", contract_ids).
661
+ where("educode_sales_follow_ups.bidded_date >= ? AND educode_sales_follow_ups.bidded_date <= ?", start_at, end_at).sum(:actual_amount)
662
+ end
663
+ render json: {amount: amount}
664
+ end
665
+
666
+ def add_year_target
667
+ history = EducodeSales::SalesTargetHistory.find_by(staff_id: params[:staff_id], year: params[:year], school_tag_id: params[:school_tag_id], target_clazz: params[:target_clazz])
668
+ # history.update_attributes(params.permit(:m_target_1, :m_target_2, :m_target_3, :m_target_4, :m_target_5, :m_target_6, :m_target_7, :m_target_8, :m_target_9, :m_target_10, :m_target_11, :m_target_12)) if history
669
+ # 不能重复添加
670
+ #if EducodeSales::SalesTargetHistory.exists?(staff_id: params[:staff_id], year: params[:year], school_tag_id: params[:school_tag_id], target_clazz: params[:target_clazz])
671
+ # return render_failure "不能重复添加"
672
+ #end
673
+ target = EducodeSales::SalesTargetHistory.new(year_target_param)
674
+ if history
675
+ use_old_attributes = %w[m_target_1 m_target_2 m_target_3 m_target_4 m_target_5 m_target_6 m_target_7 m_target_8 m_target_9 m_target_10 m_target_11 m_target_12] - params.keys
676
+ use_old_attributes.each do |attr|
677
+ target[attr] = history[attr]
678
+ end
679
+ end
680
+ if history
681
+ target.num = history.num
682
+ else
683
+ target.num = EducodeSales::SalesTargetHistory.maximum(:id).to_i + 1
684
+ end
685
+
686
+ target.creator_id = @current_admin.id
687
+ target.state = '待审核'
688
+ if target.save
689
+ render json: { id: target.id, state: target.state, updated_at: target.updated_at.to_s(:date) }
690
+ else
691
+ render_failure target
692
+ end
693
+ end
694
+
695
+ def update_year_target
696
+ target = EducodeSales::SalesTargetHistory.find(params[:id])
697
+ if target.state == '待审核'
698
+ if params[:state] == '已通过'
699
+ other_uses = EducodeSales::SalesTargetHistory.where(num: target.num, is_use: true).order(id: :desc)
700
+ if other_uses
701
+ other_uses.update(is_use: false)
702
+ last_use = other_uses.last
703
+ # 最近采用的月份目标复制过来
704
+ 12.times do |i|
705
+ if last_use.send("target_#{i+1}").present?
706
+ target.send("target_#{i+1}=", last_use.send("target_#{i+1}") )
707
+ end
708
+ end
709
+ end
710
+ # 采用修改的月份目标
711
+ 12.times do |i|
712
+ if target.send("m_target_#{i+1}").present?
713
+ target.send("target_#{i+1}=", target.send("m_target_#{i+1}") )
714
+ end
715
+ end
716
+ target.state = '已通过'
717
+ target.is_use = true
718
+ elsif params[:state] == '已驳回'
719
+ target.state = '已驳回'
720
+ end
721
+
722
+ target.comment = params[:comment]
723
+ target.reviewer_id = @current_admin.id
724
+ if target.save
725
+ render json: {state: target.state, updated_at: target.updated_at.to_s(:date)}
726
+ else
727
+ render_failure target
728
+ end
729
+ else
730
+ render json: {success: false, msg: '该状态不能编辑'}
731
+ end
732
+
733
+ end
734
+
735
+
527
736
  private
528
737
 
529
738
  def plan_params
@@ -536,7 +745,181 @@ module EducodeSales
536
745
 
537
746
  def update_business_info_extra_params
538
747
  params.permit(:plan_bid_on, :actual_bidded_on, :bidded_amount, :plan_sign_on, :actual_sign_on, :sign_amount, :plan_deploy_on, :actual_deploy_on, :plan_check_on,
539
- :actual_check_on, :prepayment_plan_on, :prepayment_actual_on, :prepayment_amount, :check_fee_plan_on, :check_fee_actual_on, :check_fee, :qa_plan_on, :qa_actual_on, :qa_amount, :account_receivable)
748
+ :actual_check_on, :prepayment_plan_on, :prepayment_actual_on, :prepayment_amount, :check_fee_plan_on, :check_fee_actual_on, :check_fee, :qa_plan_on, :qa_actual_on, :qa_amount, :account_receivable)
749
+ end
750
+
751
+ def year_target_param
752
+ params.permit(:staff_id, :year, :target_clazz, :school_tag_id, :year_finish, :year_target, :year_diff, :m_target_1, :m_target_2, :m_target_3, :m_target_4, :m_target_5, :m_target_6, :m_target_7, :m_target_8, :m_target_9, :m_target_10, :m_target_11, :m_target_12)
753
+ end
754
+
755
+ def make_target_data(sales_all_plan, data, column, type)
756
+ data.each do |item|
757
+ _column = "#{column}_#{item.m.gsub("0", '')}"
758
+ if sales_all_plan[type][item.school_tag_id].present?
759
+ if sales_all_plan[type][item.school_tag_id][_column].present?
760
+ sales_all_plan[type][item.school_tag_id][_column] += item.amount
761
+ else
762
+ sales_all_plan[type][item.school_tag_id][_column] = item.amount
763
+ end
764
+ else
765
+ sales_all_plan[type][item.school_tag_id] = {"school_tag_id" => item.school_tag_id, "school_tag_name" => item.school_tag_name}
766
+ sales_all_plan[type][item.school_tag_id][_column] = item.amount
767
+ end
768
+ sales_all_plan[type][item.school_tag_id]['type'] = type
769
+ end
770
+ sales_all_plan
771
+ end
772
+
773
+ def get_sales_all_plan(staff_id, staff_name, year, school_tag_id)
774
+
775
+ follow_up_ids = ''
776
+ if staff_id.present?
777
+ follow_up_ids = EducodeSales::AssignFollowUp.where(staff_id: staff_id).pluck(:follow_up_id).compact.join(',')
778
+ end
779
+ # 中标&商机&回款 - 目标按月
780
+ sales_target_histories = EducodeSales::SalesTargetHistory.from("
781
+ (SELECT H.id,clazz,school_tag_id,T.name as school_tag_name,sum(m_target_1) as target_1, sum(m_target_2) target_2, sum(m_target_3) target_3, sum(m_target_4) target_4, sum(m_target_5) target_5, sum(m_target_6) target_6, sum(m_target_7) target_7,sum(m_target_8) target_8,sum(m_target_9) target_9, sum(m_target_10) target_10, sum(m_target_11) target_11, sum(m_target_12) target_12
782
+ FROM educode_sales_sales_target_histories as H
783
+ LEFT JOIN school_tags AS T ON H.school_tag_id = T.id
784
+ WHERE is_use = 1 AND year = #{year} AND T.for_missions = 1
785
+ #{staff_id.present? ? " AND staff_id = #{staff_id}" : ""}
786
+ #{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
787
+ GROUP BY clazz,school_tag_id) as educode_sales_sales_target_histories
788
+ ").order('clazz asc, school_tag_id asc,id desc')
789
+
790
+ start_at = Date.new(year, 1, 1)
791
+ end_at = Date.new((year + 1), 1, 1)
792
+ follow_up_ids_where =
793
+ if staff_id.present?
794
+ follow_up_ids_where = follow_up_ids.present? ? " AND B.last_follow_up_id in (#{follow_up_ids})" : " AND B.id in(0)"
795
+ end
796
+
797
+ # 中标 - 完成
798
+ bidder_finish = EducodeSales::FollowUp.select('amount,m,school_tag_id,school_tag_name').from(
799
+ "(SELECT sum(F.actual_amount) as amount, date_format(F.bidded_date, '%m') as m,T.name as school_tag_name,
800
+ TM.school_tag_id as school_tag_id,F.deleted_at
801
+ FROM educode_sales_businesses AS B
802
+ LEFT JOIN educode_sales_follow_ups as F ON B.last_follow_up_id=F.id
803
+ LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
804
+ LEFT JOIN school_tags as T ON TM.school_tag_id=T.id
805
+ WHERE F.deleted_at IS NULL AND T.for_missions = 1 AND F.bidded_date BETWEEN '#{start_at}' AND '#{end_at}'
806
+ #{follow_up_ids_where.present? ? follow_up_ids_where : ''}
807
+ #{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
808
+ GROUP BY school_tag_id,m
809
+ ) AS educode_sales_follow_ups"
810
+ ).order('school_tag_id ASC, m asc')
811
+
812
+ # 中标 - 计划
813
+ bidder_plan = EducodeSales::FollowUp.select('amount,m,school_tag_id,school_tag_name').from(
814
+ "(SELECT sum(plan_return_money) as amount, date_format(plan_return_date, '%m') as m,T.name as school_tag_name,
815
+ TM.school_tag_id as school_tag_id,F.deleted_at
816
+ FROM educode_sales_businesses AS B
817
+ LEFT JOIN educode_sales_follow_ups as F ON B.last_follow_up_id=F.id
818
+ LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
819
+ LEFT JOIN school_tags as T ON TM.school_tag_id=T.id AND T.for_missions = 1
820
+ WHERE F.deleted_at IS NULL AND T.for_missions = 1 AND F.plan_return_date BETWEEN '#{start_at}' AND '#{end_at}'
821
+ #{follow_up_ids_where.present? ? follow_up_ids_where : ''}
822
+ #{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
823
+ GROUP BY school_tag_id,m
824
+ ORDER BY school_tag_id ASC
825
+ ) AS educode_sales_follow_ups"
826
+ ).order('school_tag_id ASC, m asc')
827
+ # 回款 - 完成
828
+ money_finish = EducodeSales::MoneyPlanRecord.select('amount,m,school_tag_id,school_tag_name').from(
829
+ "(SELECT sum(amount) as amount, date_format(R.date_at, '%m') as m,T.name as school_tag_name,
830
+ TM.school_tag_id as school_tag_id
831
+ FROM educode_sales_money_plan_records as R
832
+ LEFT JOIN educode_sales_businesses AS B ON R.business_id=B.id
833
+ LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
834
+ LEFT JOIN school_tags as T ON TM.school_tag_id=T.id AND T.for_missions = 1
835
+ WHERE T.for_missions = 1 AND R.date_at BETWEEN '#{start_at}' AND '#{end_at}'
836
+ #{follow_up_ids_where.present? ? follow_up_ids_where : ''}
837
+ #{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
838
+ GROUP BY school_tag_id,m
839
+ ORDER BY school_tag_id ASC
840
+ ) AS educode_sales_money_plan_records"
841
+ ).order('school_tag_id ASC, m asc')
842
+ # 回款 - 计划 .group_by { |d| d.m }
843
+ money_plan = EducodeSales::FollowUp.select('amount,m,school_tag_id,school_tag_name').from(
844
+ "(SELECT sum(plan_return_money) as amount, date_format(plan_return_date, '%m') as m,T.name as school_tag_name,
845
+ F.deleted_at,TM.school_tag_id as school_tag_id
846
+ FROM educode_sales_businesses AS B
847
+ LEFT JOIN educode_sales_follow_ups as F ON B.last_follow_up_id=F.id
848
+ LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
849
+ LEFT JOIN school_tags as T ON TM.school_tag_id=T.id AND T.for_missions = 1
850
+ WHERE F.deleted_at IS NULL AND T.for_missions = 1 AND plan_return_date BETWEEN '#{start_at}' AND '#{end_at}'
851
+ #{follow_up_ids_where.present? ? follow_up_ids_where : ''}
852
+ #{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
853
+ GROUP BY school_tag_id,m
854
+ ORDER BY school_tag_id ASC
855
+ ) AS educode_sales_follow_ups"
856
+ ).order('school_tag_id ASC, m asc')
857
+ # 商机-完成 .where(:bidded_date => start_datetime..end_datetime)
858
+ business_finish = EducodeSales::FollowUp.select('amount,m,school_tag_id,school_tag_name').from(
859
+ "(SELECT sum(budget_amount) as amount, date_format(bidded_date, '%m') as m,T.name as school_tag_name,
860
+ F.deleted_at,TM.school_tag_id as school_tag_id
861
+ FROM educode_sales_businesses AS B
862
+ LEFT JOIN educode_sales_follow_ups as F ON B.last_follow_up_id=F.id
863
+ LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
864
+ LEFT JOIN school_tags as T ON TM.school_tag_id=T.id AND T.for_missions = 1
865
+ WHERE F.deleted_at IS NULL AND T.for_missions = 1 AND bidded_date BETWEEN '#{start_at}' AND '#{end_at}'
866
+ #{follow_up_ids_where.present? ? follow_up_ids_where : ''}
867
+ #{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
868
+ GROUP BY school_tag_id,m
869
+ ) AS educode_sales_follow_ups
870
+ "
871
+ ).order('school_tag_id ASC, m asc')
872
+ # 商机-计划
873
+ business_plan = EducodeSales::FollowUp.select('amount,m,school_tag_id,school_tag_name').from(
874
+ "(SELECT sum(plan_a_money) as amount, date_format(plan_a_date, '%m') as m,T.name as school_tag_name,
875
+ F.deleted_at,TM.school_tag_id as school_tag_id
876
+ FROM educode_sales_businesses AS B
877
+ LEFT JOIN educode_sales_follow_ups as F ON B.last_follow_up_id=F.id
878
+ LEFT JOIN school_tag_middles AS TM ON TM.school_id=B.school_id
879
+ LEFT JOIN school_tags as T ON TM.school_tag_id=T.id AND T.for_missions = 1
880
+ WHERE F.deleted_at IS NULL AND T.for_missions = 1 AND plan_a_date BETWEEN '#{start_at}' AND '#{end_at}'
881
+ #{follow_up_ids_where.present? ? follow_up_ids_where : ''}
882
+ #{school_tag_id.present? ? " AND school_tag_id in (#{school_tag_id})" : ""}
883
+ GROUP BY school_tag_id,m
884
+ ORDER BY school_tag_id ASC
885
+ ) AS educode_sales_follow_ups"
886
+ ).order('school_tag_id ASC, m asc')
887
+
888
+ sales_all_plan = {:bidder => {}, :business => {}, :money => {}}
889
+ sales_target_histories.each do |history|
890
+ case history.clazz
891
+ when '中标'
892
+ sales_all_plan[:bidder][history.school_tag_id] = history.attributes.except('id')
893
+ when '商机'
894
+ sales_all_plan[:business][history.school_tag_id] = history.attributes.except('id')
895
+ when '回款'
896
+ sales_all_plan[:money][history.school_tag_id] = history.attributes.except('id')
897
+ else
898
+ end
899
+ end
900
+ #中标完成
901
+ sales_all_plan = make_target_data(sales_all_plan, bidder_finish, 'finish', :bidder)
902
+ #中标计划
903
+ sales_all_plan = make_target_data(sales_all_plan, bidder_plan, 'plan', :bidder)
904
+ #回款完成
905
+ sales_all_plan = make_target_data(sales_all_plan, money_finish, 'finish', :money)
906
+ #回款计划
907
+ sales_all_plan = make_target_data(sales_all_plan, money_plan, 'plan', :money)
908
+ #商机完成
909
+ sales_all_plan = make_target_data(sales_all_plan, business_finish, 'finish', :business)
910
+ #商机计划
911
+ sales_all_plan = make_target_data(sales_all_plan, business_plan, 'plan', :business)
912
+
913
+ data = sales_all_plan[:bidder].values + sales_all_plan[:business].values + sales_all_plan[:money].values
914
+
915
+ if data.empty?
916
+ data = ['id' => staff_id, 'name' => staff_name, 'target_clazz' => '商机']
917
+ end
918
+ data.each do |item|
919
+ item['id'] = staff_id
920
+ item['name'] = staff_name
921
+ item['target_clazz'] = item['clazz'].present? ? item['clazz'] : SalesTargetHistory::TARGET_CLAZZ_NAME[item['type']]
922
+ end
540
923
  end
541
924
 
542
925
  end
@@ -943,7 +943,7 @@ module EducodeSales
943
943
  staff_id = params[:staff_id] || nil
944
944
  @forecast_count_range = params[:forecast_count_range] || "month"
945
945
  forecast_default_dates = ("#{Time.now.year}-01-01".to_date.."#{Time.now.year}-#{Time.now.month}-01".to_date).map { |d| d.strftime("%Y-%m") }.uniq
946
- sale_names = %w[实际回款额 计划回款额 实际回款 计划回款额-全部 计划回款额-o类]
946
+ sale_names = %w[计划回款额 计划回款额-全部 实际回款额 实际回款额-累计 计划回款额-O类]
947
947
  case @forecast_count_range
948
948
  when "week"
949
949
  # 年初第一天周数是0会导致周数重复计算
@@ -3,9 +3,9 @@
3
3
  # 实践项目管理
4
4
  module EducodeSales
5
5
  class ShixunDectectsController < ApplicationController
6
- before_action :subject_members
7
-
6
+ before_action :subject_members, :subject_url
8
7
  def index
8
+ authorize! :checkout, BusinessDeliverSubject
9
9
  respond_to do |format|
10
10
  format.html do
11
11
  end
@@ -15,7 +15,7 @@ module EducodeSales
15
15
  if params[:q].present? && params[:q][:index].present?
16
16
  index = params[:q][:index].to_i
17
17
  end
18
- @shixun_dectects = BusinessSubjectShixun.joins(:shixun)
18
+ @shixun_dectects = BusinessSubjectShixun.left_joins(:shixun)
19
19
  .left_joins(:school)
20
20
  .joins(last_dectect: [reviewed_staff: :user])
21
21
 
@@ -27,17 +27,38 @@ module EducodeSales
27
27
  end
28
28
 
29
29
  case index
30
- when 1 # 显示待审核的 和审核被打回的
31
- @shixun_dectects = @shixun_dectects.where("dectect_type != 1")
30
+ when 1 # 显示待审核的
31
+ @shixun_dectects = @shixun_dectects.where("dectect_type = 0")
32
32
 
33
33
  when 2 # 显示已审核的
34
- @shixun_dectects = @shixun_dectects.where("dectect_type = 1 or dectect_type = 2")
34
+ str = 'dectect_type = 1 or dectect_type = 2'
35
+ if params[:q].present? && params[:q][:dectect_type].present?
36
+ if params[:q][:dectect_type].to_i == 1
37
+ str = "dectect_type = 1"
38
+ elsif params[:q][:dectect_type].to_i == 2
39
+ str = "dectect_type = 2"
40
+ end
41
+ end
42
+ @shixun_dectects = @shixun_dectects.where(str)
35
43
  else
36
44
  render_failure("操作失败,index只能为1,2")
37
45
  end
46
+ times = {}
47
+ BusinessSubjectShixun.includes(business_subject:[ business_deliver_subject: [:manages, business: [:school, last_follow_up: :assign_follow_ups]] ]).find_each do |d|
48
+ b_d_s = d.business_subject
49
+ if b_d_s.blank? || b_d_s.business.blank?
50
+ times.merge!({"#{d.id}": d.deliver_date })
51
+ elsif b_d_s.business.present?
52
+ times.merge!({ "#{d.id}": b_d_s.business.last_follow_up.reception_at })
53
+ end
54
+ end
55
+ @times = times.stringify_keys
56
+ @url
38
57
  @shixun_dectects = @shixun_dectects.select("educode_sales_business_subject_shixuns.*,
39
58
  schools.name as school_name,
40
- shixuns.name as shixun_name,
59
+ shixuns.identifier,
60
+ educode_sales_business_subject_shixuns.name as shixun_name,
61
+ educode_sales_business_subject_shixuns.id as shixuns_id,
41
62
  CONCAT(users.lastname, users.firstname) as real_name,
42
63
  educode_sales_shixun_dectects.dectect_type,
43
64
  educode_sales_shixun_dectects.content")
@@ -50,15 +71,24 @@ module EducodeSales
50
71
 
51
72
  # 审核提交
52
73
  def submit
74
+ authorize! :checkout, BusinessDeliverSubject
53
75
  respond_to do |format|
54
76
  format.json do
55
77
  ActiveRecord::Base.transaction do
56
- @shixuns = ShixunDectect.find_by(business_subject_shixun_id: params[:id])
78
+ @shixuns = ShixunDectect.order(created_at: :desc).find_by(business_subject_shixun_id: params[:id])
57
79
  if @shixuns.blank?
58
80
  @shixuns = ShixunDectect.create!(business_subject_shixun_id: params[:id],
59
81
  reviewed_id: current_user.id,
60
82
  dectect_type: 0)
61
- BusinessSubjectShixun.find(params[:id]).update(shixun_dectect_id: @shixuns.id)
83
+ BusinessSubjectShixun.find(params[:id]).update(shixun_dectect_id: @shixuns.id,
84
+ shixun_status:4)
85
+ render_success
86
+ elsif @shixuns.present? && @shixuns.dectect_type == 'agreed'
87
+ @shixuns = ShixunDectect.create!(business_subject_shixun_id: params[:id],
88
+ reviewed_id: current_user.id,
89
+ dectect_type: 0)
90
+ BusinessSubjectShixun.find(params[:id]).update(shixun_dectect_id: @shixuns.id,
91
+ shixun_status:4)
62
92
  render_success
63
93
  else
64
94
  render_failure("已经提交过了")
@@ -70,16 +100,43 @@ module EducodeSales
70
100
 
71
101
  # 通过审核
72
102
  def examine
103
+ authorize! :checkout, BusinessDeliverSubject
73
104
  ActiveRecord::Base.transaction do
74
105
  if params[:id].present? && params[:type].present?
75
106
  business_subject_shixun = BusinessSubjectShixun.find(params[:id])
76
- if business_subject_shixun.present?
77
- shixun_dectect = ShixunDectect.create!(reviewed_id: current_user.id,
78
- date: Time.now,
79
- content: params[:content].gsub(/\r\n?/, "\n").strip,
80
- business_subject_shixun_id: params[:id],
81
- dectect_type: params[:type].to_i)
82
- business_subject_shixun.update(shixun_dectect_id: shixun_dectect.id,shixun_status:5)
107
+ if business_subject_shixun.present? && business_subject_shixun.last_dectect.present?
108
+
109
+ shixun_dectect = business_subject_shixun.last_dectect
110
+ .update(reviewed_id: current_user.id,
111
+ date: Time.now,
112
+ content: params[:content].gsub(/\r\n?/, "\n").strip,
113
+ business_subject_shixun_id: params[:id],
114
+ dectect_type: params[:type].to_i)
115
+ if params[:type].to_i == 2
116
+ business_subject_shixun.update( shixun_status: 5)
117
+ elsif params[:type].to_i == 1
118
+ # 审核通过
119
+ business_subject_shixun.update( shixun_status: 9)
120
+ end
121
+ arrs = []
122
+ user_list = business_subject_shixun.all_staff.map{ |item| item.id}
123
+
124
+ user_list.each do |item|
125
+ attr = {
126
+ user_id: item,
127
+ trigger_user_id: 0,
128
+ container_id: business_subject_shixun.shixun_dectect_id.to_i,
129
+ container_type: 'EducodeSales::ShixunDectect',
130
+ tiding_type: "Project",
131
+ belong_container_type: "User",
132
+ belong_container_id: item,
133
+ created_at: Time.now,
134
+ updated_at: Time.now
135
+ }
136
+ arrs << attr
137
+ end
138
+ Tiding.create!(arrs)
139
+
83
140
  end
84
141
  render_success
85
142
  else
@@ -91,13 +148,16 @@ module EducodeSales
91
148
  # 审核拒绝通过
92
149
 
93
150
  def edit
151
+ authorize! :checkout, BusinessDeliverSubject
94
152
  render layout: false
95
153
  end
96
154
 
97
155
  def update
156
+ authorize! :checkout, BusinessDeliverSubject
98
157
  end
99
158
 
100
159
  def new
160
+ authorize! :checkout, BusinessDeliverSubject
101
161
  render layout: false
102
162
  end
103
163
 
@@ -105,6 +165,7 @@ module EducodeSales
105
165
  end
106
166
 
107
167
  def markdown
168
+ authorize! :checkout, BusinessDeliverSubject
108
169
  render layout: false
109
170
  end
110
171
  end