remotes/origin/PR-39
ArturBaybulatov 10 years ago
commit 8d3e19ed20
  1. 2
      assets/css/extra.css
  2. 6
      assets/js/chat.js
  3. 6
      chat/serializers.py
  4. 5
      templates/partials/base.html
  5. 827
      users/templates/contractor_office_chat_projects.html
  6. 4
      users/views.py

@ -112,7 +112,7 @@
color: #777620; color: #777620;
} }
#document-send-contact a { #document-send-contact a, #document-send-order a {
float: left; float: left;
font-family: 'pfdintextcomppro-regular', sans-serif; font-family: 'pfdintextcomppro-regular', sans-serif;
color: #373737; color: #373737;

@ -1,6 +1,6 @@
var SocketHandler = function () { var SocketHandler = function () {
domain = domain.replace(':' + port, ''); domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + '/chat/' + userId + '/'; var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {
@ -345,8 +345,6 @@ $(function () {
var orderId = $("#chat-order-add #orderId").val(); var orderId = $("#chat-order-add #orderId").val();
if (chatMessage) { if (chatMessage) {
//$("#chat-order-add .errorEmptyMessage").hide();
chatMessage += '<br />' + $("#document-send-order").html();
socket.add_contact_message({ socket.add_contact_message({
"format_type": "add_message_order", "format_type": "add_message_order",
"data": { "data": {
@ -479,7 +477,7 @@ $(function () {
// var currentValue = ''; // var currentValue = '';
// currentValue += file.id + ';'; // currentValue += file.id + ';';
//$("#documentSendIds").val(currentValue); //$("#documentSendIds").val(currentValue);
var htmlImg = '<a href="'+ file.url+'" class="send-doc" data-id="'+ file.id +'">' + file.name + '</a>'; var htmlImg = '<a href="'+ file.url+'" class="send-doc" data-id="'+ file.id +'">' + file.name + '</a><br />';
var document_send = $(htmlImg).appendTo("#document-send-order"); var document_send = $(htmlImg).appendTo("#document-send-order");
}); });
}, },

@ -60,8 +60,10 @@ class MessageSerializer(ModelSerializer):
def get_text(self, obj): def get_text(self, obj):
out = obj.text out = obj.text
documents = '<br />'.join([doc.file.name for doc in obj.documents.all()]) # documents = obj.documents.all()
out += '<br />' + documents # if len(documents)>0:
# documents_str = '<br />'.join([doc.file.name for doc in documents])
# out += '<br />' + documents_str
return out return out

@ -87,9 +87,9 @@
var port = '{{ request.META.SERVER_PORT }}'; var port = '{{ request.META.SERVER_PORT }}';
var queryString = '{{ request.get_full_path }}'; var queryString = '{{ request.get_full_path }}';
if (queryString.indexOf('/chat') != 0) { if ((queryString.indexOf('/chat') != 0) && (queryString.indexOf('/users/contractor-office/510/work-projects') != 0)) {
domain = domain.replace(':' + port, ''); domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + '/chat/' + userId + '/'; var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {
@ -98,7 +98,6 @@
sock.send('{"dummy": 1}'); sock.send('{"dummy": 1}');
}, 15000); }, 15000);
}; };
sock.onmessage = function (event) { sock.onmessage = function (event) {
var notificationData = JSON.parse(event.data); var notificationData = JSON.parse(event.data);
console.log(notificationData); console.log(notificationData);

@ -1,5 +1,6 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %}
{% load project_tags %} {% load project_tags %}
{% load specializtions_tags %} {% load specializtions_tags %}
{% load thumbnail %} {% load thumbnail %}
@ -16,137 +17,107 @@
{% include 'partials/contractor_profile_tabs.html' %} {% include 'partials/contractor_profile_tabs.html' %}
<div class="projectsBlock disTab"> <div class="projectsBlock disTab">
<!-- Tab2 chat order block -->
<div class="chatBlock disTab tab-pane" id="tab2">
<!-- Tab2 (chat order block)--> <div class="col-lg-3 wrMessages">
<div class="chatBlock disTab tab-pane"> <div class="messageBlock box-sizing disTab">
<div class="col-lg-3 wrMessages"> <p>Заказы</p>
<div class="messageBlock box-sizing disTab"> {% for order in orders %}
<p>Заказы</p> <div class="orderBlock box-sizing order-block" data-project-id="{{ order.project.id }}"
{% for order in orders %} id="orderBlock{{ order.id }}" data-recipent-id="{{ order.project.customer.pk }}" data-id="{{ order.id }}">
<div class="orderBlock box-sizing order-block" data-project-id="{{ order.id }}" <span class="dimovChat"></span>
id="orderBlock{{ order.order.id }}" <p class="titleOB">{{ order }}</p>
data-secure-deal="{% if order.order.secure %}true{% else %}false{% endif %}" <div class="hideOBB">
{% if order.order.contractor %} <p class="pOB"><span>Исполнитель:</span> {{ request.user.get_full_name }}</p>
data-recipent-id="{{ order.order.contractor.pk }}"
{% else %} <a href="#" class="linkChat11 full-order-info">
data-recipent-id="{{ order.order.team.owner.pk }}" <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
{% endif %} data-id="{{ order.order.id }}"> Полное описание заказа
<span class="dimovChat"></span> </a>
<p class="titleOB">{{ order }}</p>
<div class="hideOBB">
<p class="pOB">
<span>Исполнитель:</span>
{% if order.order.contractor %}
{{ order.order.contractor.get_full_name }}
{% else %}
{{ order.order.team.name }}
{% endif %}
</p>
<a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
</div>
</div> </div>
{% endfor %} </div>
</div> {% endfor %}
</div> </div>
<div class="col-lg-6 commChat"> </div>
<div id="message-chat-order-space"></div> <div class="col-lg-6 commChat">
<form id="chat-order-add"> <div id="message-chat-order-space"></div>
<input type="hidden" name="senderId" id="senderId" value="{{ request.user.pk }}"/> <form id="chat-order-add">
<input type="hidden" name="recipentId" id="recipentId"> <input type="hidden" id="orderId" name="orderId">
<input type="hidden" name="orderId" id="orderId"> <input type="hidden" id="senderId" name="senderId" value="{{ request.user.pk }}">
<textarea id="chat" class="box-sizing"></textarea> <input type="hidden" id="recipentId" name="recipentId" value="">
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя <textarea id="chat" class="box-sizing"></textarea>
отправить</p> <p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p>
<div class="bunChat"> <div class="bunChat">
<div class="setChat box-sizing upload"> <div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-order"> <input type="file" name="file" id="upload-document-order">
<p>Прикрепить файл</p> <p>Прикрепить файл</p>
</div>
<div id="document-send-order"></div>
<a href="#" id="order-chat-add-message">отправить</a>
</div>
</form>
</div>
<div class="col-lg-3 wrstepschat" id="order-stages-tab">
<p>Этапы работы</p>
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">1 / Согласование условий</p>
<p class="textStepss">
Обсуджение задания и условий выполнения работы. Подтверждение заказа исполнителем.
</p>
</div>
<div id="order-stages" class="stepssBlock"></div>
<div class="stepssBlock box-sizing disTab" id="reserveSpace" style="display:none;">
<p class="titleStepss">2 / Резервирование</p>
<p class="textStepss">
Резервирование заказчиком суммы оплаты по заказ.
Деньги перечисляются и хранятся насайте.
</p>
<ul class="stages-paid"></ul>
<div class="textAreaBlock2 FFD box-sizing disTab">
<a href="#" id="reserve-button" data-order-id="">Зарезервировать</a>
</div> </div>
<div id="document-send-order"></div>
<a href="#" id="order-chat-add-message">отправить</a>
</div> </div>
</form>
</div>
<div class="col-lg-3 wrstepschat">
<p>Этапы работы</p>
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">1 / Согласование условий</p>
<p class="textStepss">
Обсуждение задания и условий выполнения работы.
Подтверждение заказа исполнителем.
</p>
</div>
<div id="order-stages"></div>
<div class="stepssBlock box-sizing disTab" id="reserveSpace" style="display:none;">
<p class="titleStepss">2 / Резервирование</p>
<p class="textStepss">
Резервирование заказчиком суммы оплаты по заказ.
Деньги перечисляются и хранятся на сайте.
</p>
<ul class="stages-paid"></ul>
</div>
<!-- Зарезервировать средства (модальное окно)--> <div class="stepssBlock box-sizing disTab" id="completeWork">
{% include 'reverse_stage_modal.html' %} <p class="titleStepss">3 / Выполнение работы</p>
<!-- Конец блока --> <p class="textStepss">
Процесс выполнения задания в заказе до получения
<div class="stepssBlock box-sizing disTab" id="completeWork"> заказчиком итогового результата работы.
<p class="titleStepss">3 / Выполнение работы</p> </p>
<p class="textStepss"> <div id="stagesWork" class="stages-work textAreaBlock2">
Процесс выполнения задания в заказе до получения
заказчиком итогового результата работы.
</p>
<div id="stagesWork" class="stages-work"></div>
</div>
<div class="closeChat closeChat1" id="leaveReview" style="display: none;">
<a href="#" data-toggle="modal" data-target="#review-add">
Закрыть проект<br>и оставить отзыв
</a>
</div>
<div class="col-lg-12 documentsChat">
<p>Входящие документы</p>
<ul id="documentOrderSpace"></ul>
{# <a href="javascript:void(0)">#}
{# Распечатать с помощью ресурса#}
{# </a>#}
</div>
<div class="textAreaBlock2 box-sizing disTab">
<p>Для заметок</p>
<textarea id="chat2"></textarea>
<a href="#">сохранить</a>
</div> </div>
</div>
<!-- Review add -->
{% include 'review_add_modal.html' %}
<!-- -->
<!-- Arbitration add -->
{% include 'arbitration_modal.html' %}
<!-- -->
<!-- order-info -->
{% include 'order_info.html' %}
<!-- -->
<div class="closeChat closeChat1" id="leaveReview" style="display: none;">
<a href="#" data-toggle="modal" data-target="#review-add">
Закрыть проект<br>и оставить отзыв
</a>
</div>
<!-- Review add -->
{% include 'review_add_modal.html' %}
<!-- -->
<!-- Arbitration add -->
{% include 'arbitration_modal.html' %}
<!-- -->
<div class="textAreaBlock2 box-sizing disTab">
<ul class="notes-block">
</ul>
<p>Для заметок</p>
<form id="add-form-order-note">
<textarea id="chat2" name="text"></textarea>
<input type="hidden" name="order" id="orderNote" value=""/>
<input type="hidden" name="sender" id="senderNote" value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipentNote" value=""/>
<a href="#" id="add-note-button">сохранить</a>
</form>
</div> </div>
</div> </div>
<!-- End block (chat order block) --> </div>
<!-- End block Tab2-->
</div> </div>
@ -156,8 +127,10 @@
{% endblock %} {% endblock %}
{% block js_block %} {% block js_block %}
<script type="text/javascript"> <script type="text/javascript">
var userId = {{ request.user.pk }}; var userId = {{ request.user.pk }};
var domain = '{{ request.META.HTTP_HOST }}'; var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}'; var port = '{{ request.META.SERVER_PORT }}';
@ -169,159 +142,223 @@
var currentChatUser = {{ request.user.pk }}; var currentChatUser = {{ request.user.pk }};
var form = document.getElementById('message_form'); var form = document.getElementById('message_form');
$('body').on('focus',".term-picker", function(){ setTimeout(function () {
$(this).datepicker({ $(".team-order-block").first().trigger('click');
{# minDate: 0,#} }, 1000);
}); var url = '/chat/create/';
}) //Загрузка документов
$('#upload-document-team').fileupload({
url: url,
formData: {
sender: $("#team-chat-form #senderId").val(),
recipent: $("#team-chat-form #recipentId").val(),
team: $("#team-chat-form #teamId").val(),
order: $("#team-chat-form #orderId").val(),
},
crossDomain: false,
beforeSend: function (xhr, settings) {
$('#progress .progress-bar').css(
'width',
'0%'
);
if (!csrfSafeMethod(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
var currentValue = $("#documentSendIds").val();
currentValue += file.id + ';';
$("#documentSendIds").val(currentValue);
var htmlImg = '<p>' + file.name + '</p>';
var document_send = $(htmlImg).appendTo("#document-send");
});
},
fail: function(e){
console.log(e);
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
$("#reserve-button").on("click",function(e) { // Согласование этапов
$("#order-stages").on('click', "#approve-stages", function (e) {
e.preventDefault(); e.preventDefault();
$("#reserve-stage-modal").modal('show'); $(".stage-block-approve").each(function () {
var orderId = $(this).attr('data-order-id'); var stageId = $(this).attr('data-id');
$.ajax({ $.ajax({
url: '/api/stages/', url: '/api/stages/' + stageId + '/',
type: 'GET', type: 'PATCH',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId}, beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: "status=in_process",
dataType: 'json', dataType: 'json',
success: function (json) { success: function (json) {
var outputValues = ''; console.log(json);
var totalSum = 0;
var stagesIds = '';
var notPaidCount = 0;
$.each(json.results, function (i, v) {
if((v.status == 'in_process') && (!v.is_paid)) {
totalSum += parseInt(v.cost);
notPaidCount +=1;
outputValues += '<option data-stage-sum="' + v.cost + '" value="' + v.id + '">' + v.name + '</option>';
stagesIds += v.id + ';'
}
});
$("#stagesSelect").html(outputValues); },
$(".totalSum").text(totalSum); error: function (e) {
console.log('error');
console.log(e);
}
});
if(json.results.length>notPaidCount && notPaidCount>0){ });
$("#choiceWayOrder").hide(); var orderId = $(this).attr('data-order-id');
}
$("#choiceWayOrder").val(totalSum); socket.send_stages_approve({
$("#ordermodalId").val(orderId); "format_type": "approve_stages",
"data": {
"sender_id": $(this).attr('data-sender-id'),
"recipent_id": $(this).attr('data-recipent-id'),
"order_id": orderId,
"msg": "Исполнитель согласовал этапы для заказа " + orderId,
}
});
$("#stages-pay-form #stageSumPay").val(totalSum); });
$("#stages-pay-form #stagesIds").val(stagesIds);
$("#choiceWayOrder").attr('data-stages-ids',stagesIds); $(".team-chat-user").on('click', function (e) {
e.stopPropagation();
var recipentId = $(this).attr('data-id');
$("#team-chat-form #recipentId").val(recipentId);
});
} $(".team-order-block").on('click', function () {
}); $('.team-order-block').each(function () {
$(this).removeClass('orAct');
});
$(this).addClass('orAct');
}); var teamId = $(this).attr('data-team-id');
var orderId = $(this).attr('data-order-id');
$("#team-chat-form #teamId").val(teamId);
$("#team-chat-form #orderId").val(orderId);
$("#tab2").on("change","input[name=choice_way]:radio", function(e){ var inbox = document.getElementById('message-chat-team-space');
var sumStage = $("#stagesSelect").find('option:selected').attr('data-stage-sum'); inbox.innerHTML = '';
var currIdStage = $("#stagesSelect").find('option:selected').val();
$("#choiceWayStage").val(sumStage);
var currValue = $(this).val();
$("#stages-pay-form #stageSumPay").val(currValue);
var selectId = ($(this).attr('id'));
if (selectId == 'choiceWayOrder'){
$("#stages-pay-form #stagesIds").val($(this).attr('data-stages-ids'));
$("#stagesSelect").prop('disabled', 'disabled');
}else {
$("#stages-pay-form #stagesIds").val(currIdStage);
$("#stagesSelect").prop('disabled', false);
}
}); $.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'team': teamId, 'order': orderId},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id !== currentChatUser) {
senderName = v.sender.username;
className = '';
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">' + senderName + '</p> <span>' + v.created + '</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
}
});
$("#tab2").on("change","#stagesSelect", function(e){
var sumStage = $(this).find('option:selected').attr("data-stage-sum");
$("#choiceWayStage").val(sumStage);
$("#stages-pay-form #stageSumPay").val(sumStage);
$(".stageSum").text(sumStage);
$("#stages-pay-form #stagesIds").val($(this).val());
}); });
//Получить заказы // Вытащить сообщения для чата заказа
function getStages(orderId, senderId, recipentId, secureOrder) { $('.order-block').on('click', function () {
$('.order-block').each(function () {
$(this).removeClass('orAct');
});
$(this).addClass('orAct');
var orderId = $(this).attr('data-id');
var recipentId = $(this).attr('data-recipent-id');
var projectId = $(this).attr('data-project-id');
$("#chat-order-add #orderId").val(orderId);
$("#add-form-order-note #orderNote").val(orderId);
$("#orderArbitrationId").val(orderId);
$("#projectReviewId").val(projectId);
$("#chat-order-add #recipentId").val(recipentId);
$("#targetCustomerId").val(recipentId);
$("#add-form-order-note #recipentNote").val(recipentId);
var inbox = document.getElementById('message-chat-order-space');
inbox.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId, 'team__isnull': 'true'},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id !== currentChatUser) {
senderName = v.sender.username;
className = '';
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">' + senderName + '</p> <span>' + v.created + '</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
}
});
$.ajax({
url: '/api/note/',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId},
dataType: 'json',
success: function (json) {
console.log(json.results);
var noteHtmlInbox = '';
$.each(json.results, function (i, v) {
noteHtmlInbox += '<li>' + v.text + '<li>';
});
$(".notes-block").html(noteHtmlInbox);
}
});
$.ajax({ $.ajax({
url:'/api/orders/' + orderId + '/', url:'/api/orders/' + orderId + '/',
type: 'GET', type: 'GET',
data:{csrfmiddlewaretoken: csrftoken}, data:{csrfmiddlewaretoken: csrftoken},
dataType: 'json', dataType: 'json',
}).then(function(data){ }).then(function(data){
var htmlInbox = "";
var stagesReservedHtml = "";
var stagesPaidProcess = [];
var stagesInWork = [];
var stagesResults = data.stages; var stagesResults = data.stages;
var stageCount = stagesResults.length; var statusNotAgreed = false;
if (stageCount == 0) { var stagesCompleted = [];
$("#reserveSpace").hide(); if (stagesResults.length > 0) {
stageCountVal = 1;
} else {
stageCountVal = stageCount;
}
var htmlInbox = "";
var htmlInboxStage = '<p class="textStepss">Какое кол-во этапов подразумевает работа? ' +
'<input type="text" id="countStage" value="' + stageCountVal + '"size="3"/></p>';
if (stageCount == 0) {
htmlInboxStage += '<div class="numberStepp box-sizing" id="stage1">' +
'<p>Этап <span class="stage-span-id">1</span></p><form class="new-stages-form" id="stage-form">' +
'<label for="">Название</label><input class="form-control" name="name" type="text" />' +
'<label for="">Цена</label><input class="form-control" name="cost" type="text" />' +
'<input class="form-control orderStagesInput" name="order" type="hidden" value="' + orderId + '"/>' +
'<label for="">Срок</label><input class="term-picker form-control datepicker" name="term" type="text" />' +
'<label for="">Результат</label><input class="form-control" name="result" type="text" />' +
'<input class="form-control" name="pos" value="1" type="hidden" />' +
'</form></div>';
}
var statusNotAgreed = true;
var stagesInWork = [];
var stagesPaidProcess = [];
var stagesCompleted = [];
var stagePaidCount = 0;
var stagesReservedHtml = "";
$.each(stagesResults, function (i, v) { $.each(stagesResults, function (i, v) {
if (v.status == "completed"){ if (v.status == "completed"){
stagesCompleted.push(v); stagesCompleted.push(v);
} }
if(v.status == "not_agreed"){
statusNotAgreed = true;
}
if(!data.secure){ if(!data.secure){
if(v.status == "in_process") { if(v.status == "in_process"){
stagesInWork.push(v); stagesInWork.push(v);
} }
}else if ((v.status == "in_process") && (v.is_paid)){ } else if ((v.status == "in_process") && (v.is_paid)){
stagesInWork.push(v);
stagesPaidProcess.push(v); stagesPaidProcess.push(v);
stagesInWork.push(v);
} }
if(v.is_paid){
stagePaidCount +=1;
}
if (v.status == "not_agreed") {
htmlInbox += '<div class="numberStepp box-sizing">' +
'<p>Этап</p><form class="update-stages-form" data-stage-id="' + v.id + '" id="stage-form-' + v.pos + '">' +
'<label for="">Название</label><input class="form-control" type="text" name="name" value="' + v.name + '" />' +
'<label for="">Цена</label><input class="form-control" type="text" name="cost" value="' + v.cost + '" />' +
'<input class="form-control orderStagesInput" type="hidden" name="order" value="' + v.order + '"/>' +
'<label for="">Срок</label><input class="term-picker form-control datepicker" type="text" name="term" value="' + v.term + '" />' +
'<label for="">Результат</label><input class="form-control" type="text" name="result" value="' + v.result + '" />' +
'</form></div>';
} else {
statusNotAgreed = false;
htmlInboxStage = "";
var statusName = '';
if (v.status == 'completed'){
statusName = 'Завершен';
}
htmlInbox += '<div class="numberStepp box-sizing"><div class="insetNumStepp">' +
'<p class="titleNumStepp"><span>Этап ' + v.pos + '</span>' + v.name + '</p>' +
'<p class="textNumStepp">Результаты этапа:' + v.result + '</p><div>' +
'<p>до '+ v.term +'</p><span>' + v.cost + '<i class="fa fa-rub"></i></span>' +
'</div><div><p>'+ statusName +'</p></div></div></div>';
}
if(data.secure) { if(data.secure) {
if (v.is_paid) { if (v.is_paid) {
stagesReservedHtml += '<li class="reserved">Сумма за этап ' + v.pos + '.Зарезервирована.</li>'; stagesReservedHtml += '<li class="reserved">Сумма за этап ' + v.pos + '.Зарезервирована.</li>';
@ -329,73 +366,88 @@
stagesReservedHtml += '<li class="unreserved">Сумма за этап ' + v.pos + '.Не зарезервирована.</li>'; stagesReservedHtml += '<li class="unreserved">Сумма за этап ' + v.pos + '.Не зарезервирована.</li>';
} }
} }
var statusName = '';
if (v.status == 'completed'){
statusName = 'Завершен';
}
htmlInbox += '<div data-id="' + v.id + '" class="numberStepp box-sizing stage-block-approve"><div class="insetNumStepp">' +
'<p class="titleNumStepp"><span>Этап ' + v.pos + '</span>' + v.name + '</p>' +
'<p class="textNumStepp">Результаты этапа:' + v.result + '</p><div>' +
'<p> до ' + v.term + '</p><span>' + v.cost + ' <i class="fa fa-rub"></i></span></div><div><p>'+ statusName +'</p></div></div></div>';
}); });
if (stagesResults.length == stagePaidCount && data.secure){ if (statusNotAgreed) {
$("#reserve-button").parent().hide(); htmlInbox += '<div class="textAreaBlock2 FFD box-sizing disTab">' +
}else { '<a id="approve-stages" data-sender-id="{{ request.user.pk }}" data-recipent-id="' + recipentId + '"' +
$("#reserve-button").parent().show(); ' data-order-id="' + orderId + '" href="#">согласовать</a></div>';
} }
}
if (statusNotAgreed) { $("#order-stages").html(htmlInbox);
if(!data.secure) { $(".stages-paid").html(stagesReservedHtml);
htmlInbox += '<div class="box-sizing disTab">' +
'<div class="checkbox"><input name="secure" id="secureOrder" type="checkbox" style="opacity:1">' +
'Перейти в режим безопасной сделки</div></div>';
}
htmlInbox +='<div class="textAreaBlock2 box-sizing disTab">' + if(data.secure) {
'<a href="#" data-sender-id="' + senderId +'" ' + $("#reserveSpace").show();
'data-recipent-id="' + recipentId +'" data-order-id="' + orderId + '" ' + } else {
'id="addStagesForm">отправить на согласование</a> </div>'; $("#reserveSpace").hide();
}else if((stagesResults.length>0) && (data.secure)){ }
$("#reserveSpace").show();
}
htmlInbox = htmlInboxStage + htmlInbox;
$("#order-stages").html(htmlInbox);
$("#completeWork").hide();
if(stagesInWork.length > 0){ if (stagesInWork.length > 0){
$("#completeWork").show(); $("#completeWork").show();
var stage = stagesInWork[0]; var stage = stagesInWork[0];
var stageWork = '<div class="numberStepp box-sizing">' + var stageWork = '<div class="numberStepp box-sizing">' +
'<div class="insetNumStepp"><div><p>В работе '+ stage.name +'</p></div> ' + '<div class="insetNumStepp"><div><p>В работе '+ stage.name +'</p></div>' +
'<div><p>Результат этапа : '+ stage.result +'</p></div>' + '<div><p>Результат этапа : '+ stage.result +'</p></div>' +
'<div><p>Срок сдачи '+ stage.term +'</p><span>' + stage.cost + '<i class="fa fa-rub"></i></span></div>' + '<div><p>Срок сдачи '+ stage.term +' <span>' + stage.cost + '<i class="fa fa-rub"></i></span></p></div></div></div>';
'</div></div>';
if (stage.close_contractor){ if(!stage.close_contractor){
stageWork += '<div class="textAreaBlock2 FFD box-sizing disTab"><a href="#" class="closeStage" data-order-id="'+ orderId + '" data-sender-id="{{ request.user.pk }}"' + stageWork += '<div class="textAreaBlock2 FFD box-sizing disTab"><a href="#" class="closeStage" data-sender-id="{{ request.user.pk }}" data-recipent-id="'+ recipentId+'"' +
' data-recipent-id="'+ recipentId + '" data-stage-id="'+ stage.id+'">Закрыть этап '+ stage.pos +'</a></div>'; ' data-order-id="'+ data.id +'" data-stage-id="'+ stage.id +'">Завершить этап</a></div>';
}else{
stageWork += '<div><p>Этап ожидает завершения статуса от заказчика</p><div>';
} }
if (data.secure) {
if (data.secure){
stageWork += '<div class="textAreaBlock2 FFD box-sizing disTab"><a href="#" data-toggle="modal" data-target="#arbitration-add">Обратитьсяв арбитраж</a></div>'; stageWork += '<div class="textAreaBlock2 FFD box-sizing disTab"><a href="#" data-toggle="modal" data-target="#arbitration-add">Обратитьсяв арбитраж</a></div>';
} }
$("#stagesWork").html(stageWork); $("#stagesWork").html(stageWork);
} }else{
$("#completeWork").hide();
if (!data.secure){ }
$("#reserveSpace").hide();
}
if((stagesCompleted.length == stagesResults.length) && (stagesCompleted.length > 0)){ if(stagesCompleted.length == stagesResults.length && stagesCompleted.length>0){
$("#leaveReview").show(); $("#leaveReview").show();
console.log("Все этапы завершены");
}else {
$("#leaveReview").hide();
} }
if (data.status == 'completed'){ if (data.status == 'completed'){
$("#leaveReview").hide(); $("#leaveReview").hide();
} }
});
$(".stages-paid").html(stagesReservedHtml); });
//Добавить заметку.
$('#add-note-button').on('click', function (e) {
e.preventDefault();
$.ajax({
url: '/api/note/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: $("#add-form-order-note").serialize(),
dataType: 'json',
success: function (json) {
console.log(json);
$("#add-form-order-note #chat2").val("");
},
error: function (e) {
console.log('error');
console.log(e);
}
}); });
} });
//Закрыть этап
$('#tab2').on('click','.closeStage', function(e){ $('#tab2').on('click','.closeStage', function(e){
e.preventDefault(); e.preventDefault();
var stageId = $(this).attr('data-stage-id'); var stageId = $(this).attr('data-stage-id');
@ -406,16 +458,17 @@
beforeSend: function (xhr) { beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')) xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
}, },
data: {close_customer: true, status: 'completed'}, data: "close_contractor=True",
dataType: 'json', dataType: 'json',
success: function (json) { success: function (json) {
socket.send_stages_approve({ socket.send_stages_approve({
"format_type": "approve_stages", "format_type": "approve_stages",
"data": { "data": {
"sender_id": _this.attr('data-sender-id'), "sender_id": _this.attr('data-sender-id'),
"recipent_id": _this.attr('data-recipent-id'), "recipent_id": _this.attr('data-recipent-id'),
"order_id": _this.attr('data-order-id'), "order_id": _this.attr('data-order-id'),
"msg": "Заказчик закрыл этап " + json.name, "msg": "Исполнитель завершил этап " + json.name,
} }
}); });
console.log(json); console.log(json);
@ -427,206 +480,34 @@
}); });
}); });
// Добавление этапов //Добавить сообщение для исполнителей в группе
$("#order-stages").on('click', "#addStagesForm", function (e) { $("#add-team-chat-message").on('click', function () {
e.preventDefault(); var chatMessage = $("#team-chat-form #chatText").val();
var currentOrderId = $(this).attr('data-order-id'); var recipentId = $("#team-chat-form #recipentId").val();
var secureOrderEl = $("#secureOrder"); var senderId = $("#team-chat-form #senderId").val();
if(secureOrderEl.length > 0) { var teamId = $("#team-chat-form #teamId").val();
var secOrderVal = false; var orderId = $("#team-chat-form #orderId").val();
if (secureOrderEl.prop('checked')) {
secOrderVal = true; var documentSendIds = $("#documentSendIds").val();
} console.log(documentSendIds);
$.ajax({ var teamDocumentIds = documentSendIds.split(';');
url: '/api/orders/' + currentOrderId + '/', teamDocumentIds.pop();
type: 'PATCH', console.log(teamDocumentIds);
beforeSend: function (xhr) { socket.add_team_message({
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')) "format_type": "add_message_team",
},
data: {secure: secOrderVal},
dataType: 'json',
success: function (json){
},
error: function(e){
console.log(e);
}
});
}
$(".new-stages-form").each(function (i, v) {
$.ajax({
url: '/api/stages/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: $(this).serialize(),
dataType: 'json',
success: function (json) {
console.log(json);
},
error: function (e) {
console.log('error');
console.log(e);
}
});
});
$(".update-stages-form").each(function (i, v) {
var currentStageId = parseInt($(this).attr('data-stage-id'));
$.ajax({
url: '/api/stages/' + currentStageId + '/',
type: 'PUT',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: $(this).serialize(),
dataType: 'json',
success: function (json) {
console.log(json);
},
error: function (e) {
console.log('error');
console.log(e);
}
});
});
var currentRecipentId = $(this).attr('data-recipent-id');
var secureOrder = true
socket.send_stages_approve({
"format_type": "approve_stages",
"data": { "data": {
"sender_id": userId, "sender_id": senderId,
"recipent_id": currentRecipentId, "recipent_id": recipentId,
"order_id": currentOrderId, "chat_message": chatMessage,
"msg": "Этапы для заказа "+ currentOrderId +"изменены", "team_id": teamId,
"order_id": orderId,
} }
}); });
{# setTimeout(function () {#} $("#team-chat-form #chatText").val("");
{# getStages(currentOrderId,userId,currentRecipentId,secureOrder);#} $("#document-send").html("");
{##}
{# }, 1000);#}
});
//Изменение счетчика
$('#order-stages-tab').on('change', '#countStage', function () {
var countStage = parseInt($(this).val());
var currentCountStage = $(".numberStepp").length;
if ((countStage<1) || isNaN(countStage)) {
countStage = 1;
$('#order-stages-tab #countStage').val(currentCountStage);
}else {
if (countStage > currentCountStage) {
for (var jj = currentCountStage; jj < countStage; jj++) {
var pos = jj + 1;
var lastFormStage = $(".numberStepp").last();
var orderId = lastFormStage.find('.orderStagesInput').val();
var addFormTemplate = '<div class="numberStepp box-sizing" id="stage1">' +
'<p>Этап <span class="stage-span-id">' + pos + '</span></p><form class="new-stages-form" id="stage-form">' +
'<label for="">Название</label><input class="form-control" name="name" type="text" />' +
'<label for="">Цена</label><input class="form-control" name="cost" type="text" />' +
'<input class="form-control orderStagesInput" name="order" type="hidden" value="' + orderId + '" />' +
'<label for="">Срок</label><input class="term-picker form-control datepicker" name="term" type="text" />' +
'<label for="">Результат</label><input class="form-control" name="result" type="text" />' +
'<input class="form-control" name="pos" value="' + pos + '" type="hidden" />'
'</form></div>';
lastFormStage.after(addFormTemplate);
}
} else if (countStage < currentCountStage) {
var ii = currentCountStage;
$($(".numberStepp").get().reverse()).each(function () {
var currenFormName = ($(this).find('form').attr('class'));
if (ii > countStage) {
$(this).remove();
}
ii--;
});
}
}
});
// Для заказов все вытащить
$('.order-block').on('click', function () {
$("#chat-order-add").css("display", "block");
$("#formsetStage").css("display", "block");
$('.order-block').each(function () {
$(this).removeClass('orAct');
});
$(this).addClass('orAct');
var orderId = $(this).attr('data-id');
var projectId = $(this).attr('data-project-id');
var recipentId = $(this).attr('data-recipent-id');
var secureOrder = $(this).attr('data-secure-deal');
secureOrder = Boolean(secureOrder);
$("#chat-order-add #orderId").val(orderId);
$("#orderArbitrationId").val(orderId);
$("#projectReviewId").val(projectId);
$("#reserve-button").attr('data-order-id', orderId);
$("#targetContractorId").val(recipentId);
$("#chat-order-add #recipentId").val(recipentId);
$(".orderStagesInput").val(orderId);
var inbox = document.getElementById('message-chat-order-space');
var docList = document.getElementById('documentOrderSpace');
inbox.innerHTML = '';
docList.innerHTML = '';
$.ajax({
url:'/api/documents',
type: 'GET',
data:{
csrfmiddlewaretoken: csrftoken,
'order': orderId
},
dataType: 'json',
success: function (json){
console.log(json);
$.each(json.results, function (i, v) {
docList.innerHTML += '<li style="word-break: break-all;"><a class="file-link" href="'+ v.file_url +'">'+ v.file+'</a></li>';
});
},
error: function(e){
console.log(e);
}
});
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId,'team__isnull': 'true'},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id !== currentChatUser) {
senderName = v.sender.username;
className = '';
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat ' + className + '"><div class="topCommChat">' +
'<p class="nameCommChat">' + senderName + '</p><span>' + v.created + '</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
}
});
getStages(orderId,userId,recipentId, secureOrder);
}); });
}); });
var userId = '{{ request.user.pk }}';
</script> </script>
{% endblock %} {% endblock %}

@ -408,11 +408,11 @@ class TeamProfileView(DetailView):
return context return context
class ContractorChatProjectsView(BaseMixin, View): class ContractorChatProjectsView(View):
template_name = 'contractor_office_chat_projects.html' template_name = 'contractor_office_chat_projects.html'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs) context = {}
contractor = get_object_or_404(User.contractor_objects, pk=kwargs.get('pk')) contractor = get_object_or_404(User.contractor_objects, pk=kwargs.get('pk'))
context['contractor'] = contractor context['contractor'] = contractor
team_ids = [] team_ids = []

Loading…
Cancel
Save