· 6 years ago · Dec 12, 2019, 09:32 AM
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using EleWise.ELMA.API;
6using EleWise.ELMA.Model.Common;
7using EleWise.ELMA.Model.Entities;
8using EleWise.ELMA.Model.Managers;
9using EleWise.ELMA.Model.Types.Settings;
10using EleWise.ELMA.Model.Entities.ProcessContext;
11using Context = EleWise.ELMA.Model.Entities.ProcessContext.P_ClCash4Contractor;
12using EleWise.ELMA.Logging;
13
14//using System.Text;
15using System.Text.RegularExpressions;
16using System.Data;
17using System.Data.SqlClient;
18using EleWise.ELMA.Model.Services;
19using EleWise.ELMA.Runtime.Db.Migrator.Framework;
20
21// для использование InterfaceActiator (добавление строки блока)
22using System.Web.Mvc;
23
24//для работы в HTML
25// для использования оргстуктуры
26using EleWise.ELMA.Security.Managers;
27using EleWise.ELMA.Security.Models;
28
29// для использования типа Money
30using EleWise.ELMA.Common.Models;
31
32// для поиска в справочнике контрагентов
33//using EleWise.ELMA.Model.Entities;
34using EleWise.ELMA.CRM.Models;
35
36//для создания маршрута согласования
37using EleWise.ELMA.Documents.Models.Tasks;
38using EleWise.ELMA.ConfigurationModel;
39
40//using EleWise.ELMA.API;
41//using EleWise.ELMA.Model.Services;
42using EleWise.ELMA.Documents.Models;
43using EleWise.ELMA.Documents.Managers;
44using EleWise.ELMA.Documents.Docflow;
45
46//для генерации документа
47//using EleWise.ELMA.Documents.Managers;
48using EleWise.ELMA.Runtime.Managers;
49using EleWise.ELMA.Services;
50
51// запуск согласования
52//using EleWise.ELMA.Documents.Managers;
53//using EleWise.ELMA.Documents.Models.Tasks;
54using EleWise.ELMA.Security;
55
56//using EleWise.ELMA.Security.Models;
57//using EleWise.ELMA.Services;
58using EleWise.ELMA.Tasks.Models;
59
60// для поиска в справочниках
61//using EleWise.ELMA.Model.Services;
62//для конвертации файла формата doc в PDF
63using System.Xml;
64using Aspose.Words;
65
66//для конвертации файла формата doc
67//using Aspose.Cells; //для конвертации файла формата xls
68using Aspose.Pdf;
69using EleWise.ELMA.Files;
70using Microsoft.CSharp;
71using System.IO;
72using System.Web;
73
74// для конвертаций между форматами
75using Aspose.Pdf.Facades;
76using System.Drawing;
77
78// для конвертации из Excel в pdf
79using Aspose.Cells;
80using System.Globalization;
81using System.Threading;
82
83// для поиска по контексту процесса
84using EleWise.ELMA.Extensions;
85using EleWise.ELMA.Workflow.Managers;
86using EleWise.ELMA.Workflow.Models;
87
88// для интеграции с 1С
89using Newtonsoft.Json;
90using RestSharp;
91using RestSharp.Authenticators;
92using System.Threading.Tasks;
93using EleWise.ELMA.Runtime;
94using EleWise.ELMA.Runtime.Managers;
95
96namespace EleWise.ELMA.Model.Scripts
97{
98 /// <summary>
99 /// Модуль сценариев процесса "Оплата подрядчику/аутсорсеру/фрилансеру"
100 /// </summary>
101 /// <example>
102 /// <![CDATA[
103 /// >>>>>>>>>>>>>>>ВАЖНАЯ ИНФОРМАЦИЯ!!!<<<<<<<<<<<<<<<
104 /// Данный редактор создан для работы с PublicAPI.
105 /// PublicAPI предназначен для разработки сценариев ELMA.
106 /// Например, с помощью PublicAPI можно добавить комментарий к документу:
107 /// //Загружаем документ
108 /// var doc = PublicAPI.Docflow.Document.Load(56);
109 /// //Добавляем комментарий
110 /// PublicAPI.Docflow.Document.AddComment(doc, "тут ваш комментарий");
111 ///
112 /// Более подробно про PublicAPI вы можете узнать тут: http://www.elma-bpm.ru/kb/article-642ApiRoot.html
113 ///
114 /// Если же вам нужна более серьёзная разработка, выходящая за рамки PublicAPI, используйте
115 /// сторонние редакторы кода, такие как SharpDevelop и VisualStudio.
116 /// Информацию по запуску кода в стороннем редакторе вы можете найти тут:
117 /// http://www.elma-bpm.ru/kb/article-837.html
118 /// ]]>
119 /// </example>
120 public partial class P_ClCash4Contractor_Scripts : EleWise.ELMA.Workflow.Scripts.ProcessScriptBase<Context>
121 {
122 //*******************************************************************************************
123 //************************** ПРОВЕРКА КОНТРАГЕНТА *******************************************
124 //*******************************************************************************************
125 public List<string> validextensions_list = new List<string> {
126 ".pdf",
127 ".doc",
128 ".docx",
129 ".xls",
130 ".xlsx",
131 ".jpg",
132 ".jpeg",
133 ".png",
134 ".bmp",
135 ".rtf"
136 };
137
138 public class Contractor_request
139 {
140 public string ourINN;
141
142 public string inn;
143
144 public string bic;
145
146 public string accountnumber;
147
148 public Contractor_request(string OurINN, string INN, string BIC, string AccountNumber)
149 {
150 ourINN = OurINN;
151 inn = INN;
152 bic = BIC;
153 accountnumber = AccountNumber;
154 }
155 }
156
157 public class Account
158 {
159 public string inn;
160
161 public string kpp;
162
163 public string namecontr;
164
165 public string code;
166
167 public string uid;
168
169 public string bic;
170
171 public string namebank;
172
173 public string accountnumber;
174
175 public string coracc;
176
177 public Account(string INN, string KPP, string ContractorName, string Code, string BIC, string BankName, string AccountNumber, string CorrAcc, string Uid1C)
178 {
179 inn = INN;
180 kpp = KPP;
181 namecontr = ContractorName;
182 code = Code;
183 uid = Uid1C;
184 bic = BIC;
185 namebank = BankName;
186 accountnumber = AccountNumber;
187 coracc = CorrAcc;
188 }
189 }
190
191 public class JsonResult
192 {
193 public List<Account> accounts = new List<Account>();
194
195 public string bic;
196
197 public string namebank;
198
199 public string corracc;
200
201 public string error;
202 }
203
204 public JsonResult Lib1C_CheckContractor(string OurINN, string INN, string BIC, string AccountNumber, out string context, out string status)
205 {
206 var contractor_request = new Contractor_request(OurINN, INN, BIC, AccountNumber);
207 var client = new RestClient("http://vs83aps.sercons.local/");
208 client.Authenticator = new HttpBasicAuthenticator("ElmaDok", "ElmaDok");
209 var request = new RestRequest("nsi/hs/reference/kontragentbank/" + OurINN, Method.POST);
210 request.RequestFormat = DataFormat.Json;
211 var json = JsonConvert.SerializeObject(contractor_request);
212 Console.WriteLine("my json =" + json);
213 var s = HttpUtility.UrlEncode(json);
214 request.AddParameter("application/json", s, RestSharp.ParameterType.RequestBody);
215 var queryResult = client.Execute(request);
216 var statusCode = (int)queryResult.StatusCode;
217 context = HttpUtility.UrlDecode(queryResult.Content);
218 status = queryResult.StatusCode.ToString();
219 //System.Console.WriteLine ("-");
220 //HttpEncoder.Current = HttpEncoder.Default;
221 Console.WriteLine("queryResult.Content:\n" + queryResult.Content);
222 string json_res_text = HttpUtility.UrlDecode(queryResult.Content).ToString();
223 Console.WriteLine("json_res_text:\n" + json_res_text);
224 JsonResult json_result = new JsonResult();
225 try
226 {
227 json_result = JsonConvert.DeserializeObject<JsonResult>(json_res_text);
228 }
229 catch
230 {
231 }
232 return json_result;
233 }
234
235 public class Contractor_request2
236 {
237 public string ourINN;
238
239 public string inn;
240
241 public string bic;
242
243 public string accountnumber;
244
245 public bool getcbc;
246
247 public Contractor_request2(string OurINN, string INN, string BIC, string AccountNumber, bool GetKBK)
248 {
249 ourINN = OurINN;
250 inn = INN;
251 bic = BIC;
252 accountnumber = AccountNumber;
253 getcbc = GetKBK;
254 }
255 }
256
257 public class KBK
258 {
259 public string cbc;
260
261 public string okato;
262
263 public string purpose;
264 }
265
266 public class JsonResult2
267 {
268 public List<Account> accounts = new List<Account>();
269
270 public string bic;
271
272 public string namebank;
273
274 public string corracc;
275
276 public string error;
277
278 public List<KBK> ArrayListCBC = new List<KBK>();
279 }
280
281 public JsonResult2 Lib1C_CheckContractor_KBK(string OurINN, string INN, string BIC, string AccountNumber, bool GetKBK, out string context, out string status)
282 {
283 var contractor_request = new Contractor_request2(OurINN, INN, BIC, AccountNumber, GetKBK);
284 var client = new RestClient("http://vs83aps.sercons.local/");
285 client.Authenticator = new HttpBasicAuthenticator("ElmaDok", "ElmaDok");
286 var request = new RestRequest("nsi/hs/reference/kontragentbank/" + OurINN, Method.POST);
287 request.RequestFormat = DataFormat.Json;
288 var json = JsonConvert.SerializeObject(contractor_request);
289 Console.WriteLine("my json =" + json);
290 var s = HttpUtility.UrlEncode(json);
291 request.AddParameter("application/json", s, RestSharp.ParameterType.RequestBody);
292 var queryResult = client.Execute(request);
293 var statusCode = (int)queryResult.StatusCode;
294 context = HttpUtility.UrlDecode(queryResult.Content);
295 status = queryResult.StatusCode.ToString();
296 //System.Console.WriteLine ("-");
297 //HttpEncoder.Current = HttpEncoder.Default;
298 Console.WriteLine("queryResult.Content:\n" + queryResult.Content);
299 string json_res_text = HttpUtility.UrlDecode(queryResult.Content).ToString();
300 Console.WriteLine("json_res_text:\n" + json_res_text);
301 JsonResult2 json_result = new JsonResult2();
302 try
303 {
304 json_result = JsonConvert.DeserializeObject<JsonResult2>(json_res_text);
305 }
306 catch
307 {
308 }
309 return json_result;
310 }
311
312 //*******************************************************************************************
313 //************************** СОЗДАНИЕ ПЛАТЕЖКИ **********************************************
314 //*******************************************************************************************
315 public class PPrequest
316 {
317 public string ourINN;
318
319 public string namecontr;
320
321 public string inn;
322
323 public string kpp;
324
325 public string bic;
326
327 public string accountnumber;
328
329 public string code;
330
331 public double sum;
332
333 public string currency;
334
335 public bool nds;
336
337 public string purpose;
338
339 public string date;
340
341 public string loginuser;
342
343 public string responsible;
344
345 public bool procuration;
346
347 public string ProcessID;
348
349 public string uid;
350
351 public List<Nomenclatures> list;
352
353 public PPrequest(string OurINN, string Code, string ContractorName, string INN, string KPP, string AccountNumber, string BIC, double Sum, string Currency, bool NDS, string Purpose, string Date, string Loginuser, string Responsible, bool Procuration, string processID, string Uid1C)
354 {
355 ourINN = OurINN;
356 inn = INN;
357 bic = BIC;
358 accountnumber = AccountNumber;
359 namecontr = ContractorName;
360 code = Code;
361 sum = Sum;
362 purpose = Purpose;
363 nds = NDS;
364 date = Date;
365 currency = Currency;
366 loginuser = Loginuser;
367 kpp = KPP;
368 responsible = Responsible;
369 procuration = Procuration;
370 ProcessID = processID;
371 uid = Uid1C;
372 }
373
374 public class Nomenclatures
375 {
376 public string name;
377
378 public double amount;
379
380 public Nomenclatures(string Name, double Amount)
381 {
382 name = Name;
383 amount = Amount;
384 }
385 }
386 }
387
388 public class PPrequest_KBK
389 {
390 public string ourINN;
391
392 public string namecontr;
393
394 public string inn;
395
396 public string kpp;
397
398 public string bic;
399
400 public string accountnumber;
401
402 public string code;
403
404 public double sum;
405
406 public string currency;
407
408 public bool nds;
409
410 public string purpose;
411
412 public string date;
413
414 public string loginuser;
415
416 public string responsible;
417
418 public bool procuration;
419
420 public string ProcessID;
421
422 public string uid;
423
424 public string cbc;
425
426 public string okato;
427
428
429 //(c)Бушев 1с
430 public string paymentway;
431 public string unit;
432 public string filial;
433 public string chargegroup2;
434 public string chargegroup;
435 public string chargetype;
436 public string datepaymentplanned;
437 public string numbersincrm;
438 public string numappcrm;
439 public string contractorname;
440 public string sumcash;
441 public string sumpayment;
442 public string htmlandstamp;
443
444 // public List<elementsum> tableoplata;
445
446 public string tableoplata;
447
448 // public string employeewhompay;
449 // public object fileaccountpdf;
450 //(с)Бушев
451 public List<Nomenclatures> list;
452
453 public PPrequest_KBK(string OurINN, string Code, string ContractorName, string INN, string KPP, string AccountNumber, string BIC, double Sum, string Currency, bool NDS, string Purpose, string Date, string Loginuser, string Responsible, bool Procuration, string processID, string Uid1C, string KBK, string OKTMO,
454 string PaymentWay, string Unit, string Filial, string ChargeGroup2, string ChargeGroup, string ChargeType,
455 string DatePaymentPlanned, string NumbersInCRM, string SumCash, string SumPayment, string Tableoplata)
456
457//Бушев было
458 // public PPrequest_KBK(string OurINN, string Code, string ContractorName, string INN, string KPP, string AccountNumber, string BIC, double Sum, string Currency, bool NDS, string Purpose, string Date, string Loginuser, string Responsible, bool Procuration, string processID, string Uid1C, string KBK, string OKTMO,
459 // string PaymentWay, string Unit, string Filial, string ChargeGroup2, string ChargeGroup, string ChargeType,
460 // string DatePaymentPlanned, string NumbersInCRM, string SumCash, string SumPayment, List<elementsum> Tableoplata)//, string EmployeeWhomPay)//, object FileAccountPDF)
461
462 //Бушев Стало
463
464 // public PPrequest_KBK(string OurINN, string Code, string ContractorName, string INN, string KPP, string AccountNumber, string BIC, double Sum, string Currency, bool NDS, string Purpose, string Date, string Loginuser, string Responsible, bool Procuration, string processID, string Uid1C, string KBK, string OKTMO,
465 // string PaymentWay, string Unit, string Filial, string ChargeGroup2, string ChargeGroup, string ChargeType,
466 // string DatePaymentPlanned, string NumbersInCRM, string SumCash, string SumPayment)//, string EmployeeWhomPay)//, object FileAccountPDF)
467
468 {
469 ourINN = OurINN;
470 inn = INN;
471 bic = BIC;
472 accountnumber = AccountNumber;
473 namecontr = ContractorName;
474 code = Code;
475 sum = Sum;
476 purpose = Purpose;
477 nds = NDS;
478 date = Date;
479 currency = Currency;
480 loginuser = Loginuser;
481 kpp = KPP;
482 responsible = Responsible;
483 procuration = Procuration;
484 ProcessID = processID;
485 uid = Uid1C;
486 cbc = KBK;
487 okato = OKTMO;
488 //(c)Бушев 1с
489 paymentway = PaymentWay;
490 unit = Unit;
491 filial = Filial;
492 chargegroup2 = ChargeGroup2;
493 chargegroup = ChargeGroup;
494 chargetype = ChargeType;
495 datepaymentplanned = DatePaymentPlanned;
496 numbersincrm = NumbersInCRM;
497 // numappcrm = NumAppCRM;
498 contractorname = ContractorName;
499 sumcash = SumCash;
500 sumpayment = SumPayment;
501 tableoplata = Tableoplata;
502 // employeewhompay = EmployeeWhomPay;
503 // fileaccountpdf = FileAccountPDF;
504 //(с)Бушев
505
506 }
507
508 public class Nomenclatures
509 {
510 public string name;
511
512 public double amount;
513
514 public Nomenclatures(string Name, double Amount)
515 {
516 name = Name;
517 amount = Amount;
518 }
519 }
520 }
521
522 public class PPResult
523 {
524 public string link;
525
526 public string file;
527
528 public string result;
529
530 public PPResult(string Link, string FilePath, string Result)
531 {
532 link = Link;
533 file = FilePath;
534 result = Result;
535 }
536 }
537
538 public PPResult Lib1C_CreatePPDoc(string OurINN, string INN, string BIC, string KPP, string AccountNumber, string ContractorName, string Code, double Sum, string Purpose, bool NDS, string Date, string Currency, string Loginuser, string Responsible, bool Procuration, string processID, string Uid1C, out string context, out string status)
539 {
540 PPResult result = new PPResult("", "", "");
541 var CreateRequest = new PPrequest(OurINN, Code, ContractorName, INN, KPP, AccountNumber, BIC, Sum, Currency, NDS, Purpose, Date, Loginuser, Responsible, Procuration, processID, Uid1C);
542 var client = new RestClient("http://vs83aps.sercons.local/");
543 client.Authenticator = new HttpBasicAuthenticator("ElmaDok", "ElmaDok");
544 var request = new RestRequest("nsi/hs/document/platezhnoeporuchenie/" + OurINN, Method.POST);
545 request.RequestFormat = DataFormat.Json;
546 var json = JsonConvert.SerializeObject(CreateRequest);
547 Console.WriteLine(json);
548 var s = HttpUtility.UrlEncode(json);
549 request.AddParameter("application/json", s, RestSharp.ParameterType.RequestBody);
550 var queryResult = client.Execute(request);
551 var statusCode = (int)queryResult.StatusCode;
552 context = HttpUtility.UrlDecode(queryResult.Content);
553 status = queryResult.StatusCode.ToString();
554 Console.WriteLine(queryResult.Content);
555 try
556 {
557 result = JsonConvert.DeserializeObject<PPResult>(HttpUtility.UrlDecode(queryResult.Content));
558 }
559 catch
560 {
561 result.result = "не смогли распарсить json из 1с:" + queryResult.Content;
562 }
563 return result;
564 }
565
566 //*******************************************************************************************
567 //************************** ДАННЫЕ ИЗ CRM *** **********************************************
568 //*******************************************************************************************
569 // Информация о договоре из CRM
570 public class CRMData
571 {
572 public string Number;
573
574 public string CustomerName;
575
576 public string OurCompanyName;
577
578 public string OurCompanyINN;
579
580 public string CustomerINN;
581
582 public double ContractSum;
583
584 public string ContractCurrency;
585
586 public double SumPaid;
587
588 public double SumSpent;
589
590 public double SumSpentPlan;
591
592 public string SumSpentDescription;
593
594 public double SumReturn;
595
596 public double RetroFactSum;
597
598 public string RetroFactCurrency;
599
600 public double CostPrice;
601
602 public string ManagerLogin;
603
604 public User Manager;
605
606 public string OfferType;
607
608 public bool IsClosed;
609
610 public string DocState;
611
612 public string ContractNumber;
613
614 public string ContractDate;
615
616 public string ContractAppendixPosition;
617
618 public string AppendixDate;
619
620 public bool IsTender;
621
622 public bool IsPostPayment;
623 }
624
625 /// <summary>
626 /// GetContractDataFromTerrasoftCRM
627 /// </summary>
628 public virtual CRMData GetContractDataFromTerrasoftCRM(string NumAppCRM)
629 {
630 CRMData obj = new CRMData
631 {
632 Number = NumAppCRM,
633 ContractSum = 0,
634 CustomerName = "",
635 OurCompanyName = "",
636 OurCompanyINN = "",
637 CustomerINN = "",
638 ContractCurrency = "",
639 SumPaid = 0,
640 SumSpent = 0,
641 SumSpentPlan = 0,
642 SumSpentDescription = "",
643 SumReturn = 0,
644 RetroFactSum = 0,
645 RetroFactCurrency = "",
646 CostPrice = 0,
647 ManagerLogin = "",
648 Manager = null,
649 OfferType = "",
650 IsClosed = false,
651 DocState = "",
652 ContractNumber = "",
653 ContractDate = "",
654 ContractAppendixPosition = "",
655 AppendixDate = "",
656 IsTender = false,
657 IsPostPayment = false
658 };
659 double sum = 0;
660 string[] sdelkasplit = Regex.Split(NumAppCRM, @"\D+");
661 //context.SdelkaVCPM6Cifr = String.Join("; ", sdelkasplit);
662 if (sdelkasplit.Length > 0)
663 {
664 string DBPath = @"Data Source=SRSSQL-NEW;Initial Catalog=tcrm;" + "user ID=elSinc;password=Asdqwe234;Integrated Security=false;Pooling=false";
665 SqlConnection cn = new SqlConnection();
666 using (cn)
667 {
668 try
669 {
670 cn.ConnectionString = DBPath;
671 cn.Open();
672 for (int i = 0; i < sdelkasplit.Count(); i++)
673 {
674 if (sdelkasplit[i].Length == 6)
675 {
676 string strSQL = "EXEC dbo.df_GetDemandStampValues @Number = N'" + sdelkasplit[i] + "'";
677 SqlCommand myCommand = new SqlCommand(strSQL, cn);
678 SqlDataReader dr = myCommand.ExecuteReader();
679 while (dr.Read())
680 {
681 //context.SysLog += "\n найдена информация по сделке "+ NumAppCRM;
682 // var newrow = InterfaceActivator.Create<P_ZayavlenieNaPererashod_Dokumenty>();
683 // Сумма сделки (не договора!)
684 obj.ContractSum = Convert.ToDouble("0" + dr["Amount"]);
685 obj.ContractCurrency = dr["Currency"].ToString();
686 obj.ContractNumber = dr["ContractTitle"].ToString();
687 DateTime cdate;
688 DateTime.TryParse(dr["ContractDate"].ToString(), out cdate);
689 //dr["ContractDate"].ToDateTime("dd.MM.yyyy HH:mm:ss.fff");
690 obj.ContractDate = cdate.ToShortDateString();
691 Console.WriteLine(obj.ContractDate);
692 obj.ContractAppendixPosition = dr["AppendixPosition"].ToString();
693 // Дата приложения
694 DateTime appendixdate;
695 DateTime.TryParse(dr["AppendixDate"].ToString(), out appendixdate);
696 obj.AppendixDate = appendixdate.ToShortDateString();
697 // Валюта договора
698 obj.CustomerName = dr["CustomerName"].ToString();
699 obj.OurCompanyName = dr["OrganizationName"].ToString();
700 obj.OurCompanyINN = dr["OrganizationINN"].ToString();
701 // Название клиента
702 obj.CustomerINN = dr["CustomerINN"].ToString();
703 // ИНН Клиента
704 Console.WriteLine("ContractSum = " + obj.ContractSum.ToString());
705 // Оплачено
706 obj.SumPaid = Convert.ToDouble("0" + dr["PaymentSum"].ToString());
707 Console.WriteLine("SumPaid = " + obj.SumPaid.ToString());
708 // Расход
709 obj.SumSpent = Convert.ToDouble("0" + dr["OutputAmount"].ToString());
710 // расход фактический
711 // Console.WriteLine ("SumSpent = " + obj.SumSpent.ToString ());
712 obj.SumSpentPlan = Convert.ToDouble("0" + dr["OutputPlanAmount"].ToString());
713 // Расход плановый
714 // Описание расхода
715 obj.SumSpentDescription = dr["OutputAmountComments"].ToString();
716 Console.WriteLine("SumSpentDescription = " + obj.SumSpentDescription);
717 // Ретро
718 obj.SumReturn = Convert.ToDouble("0" + dr["RollbackSum"].ToString());
719 Console.WriteLine("SumReturn = " + obj.SumReturn.ToString());
720 // Себестоимость
721 // Double.TryParse(dr["CostBasicPrice"].ToString(),out sum);
722 // obj.CostPrice = sum;
723 obj.CostPrice = Convert.ToDouble("0" + dr["CostBasicPrice"].ToString());
724 Console.WriteLine("CostPrice = " + obj.CostPrice.ToString());
725 // Вид услуги
726 obj.OfferType = dr["OfferingType"].ToString();
727 Console.WriteLine("OfferType = " + obj.OfferType);
728 // Сделка закрыта
729 obj.IsClosed = Convert.ToBoolean(dr["IsClosed"]);
730 Console.WriteLine("IsClosed = " + obj.IsClosed.ToString());
731 obj.IsTender = Convert.ToBoolean(dr["IsTender"]);
732 obj.IsPostPayment = Convert.ToBoolean(dr["IsPostpayment"]);
733 // Менеджер
734 try
735 {
736 string login = dr["ManagerLogin"].ToString();
737 login = login.Replace(@"SERCONS\", "");
738 Console.WriteLine("login = " + login);
739 obj.ManagerLogin = login;
740 obj.Manager = PublicAPI.Portal.Security.User.LoadByLogin(login);
741 Console.WriteLine("Manager = " + obj.Manager.FullName);
742 }
743 catch
744 {
745 }
746 int docstate = Convert.ToInt32(dr["DocumentExist"]);
747 if (docstate == 1)
748 {
749 obj.DocState = "завешан";
750 if (obj.IsClosed == true)
751 {
752 obj.DocState = "закрыт (" + Convert.ToDateTime(dr["FinCloseDate"].ToString()) + ")";
753 }
754 }
755 else
756 {
757 obj.DocState = "не завешан";
758 }
759 Console.WriteLine("DocState = " + obj.DocState);
760 // сумма ретро факт
761 // RollbackFactAmount
762 // string RollbackFactAmount = dr["RollbackFactAmount"].ToString();
763 // Console.WriteLine ("RollbackFactAmount = " + RollbackFactAmount);
764 // if (RollbackFactAmount.IndexOf("-") >= 0)
765 // {
766 // RollbackFactAmount = RollbackFactAmount.Substring(1, RollbackFactAmount.Length -1);
767 // obj.RetroFactSum = Double.Parse("0" + RollbackFactAmount);
768 // }
769 // else
770 // {
771 // obj.RetroFactSum = Double.Parse("0" + RollbackFactAmount);
772 // }
773 // Console.WriteLine ("obj.RetroFactSum = " + obj.RetroFactSum.ToString());
774 obj.RetroFactSum = 0;
775 try
776 {
777 obj.RetroFactSum = Double.Parse(dr["RollbackFactAmount"].ToString());
778 }
779 catch
780 {
781 }
782 Console.WriteLine("obj.RetroFactSum = " + obj.RetroFactSum.ToString());
783 // RollbackFactCurrencyShortName
784 obj.RetroFactCurrency = dr["RollbackFactCurrencyShortName"].ToString();
785 }
786 dr.Close();
787 }
788 }
789 }
790 catch (Exception e)
791 {
792 cn.Close();
793 Console.WriteLine(e.ToString());
794 }
795 finally
796 {
797 cn.Close();
798 }
799 }
800 }
801 return obj;
802 }
803
804 //*******************************************************************************************
805 //************************** ***************** **********************************************
806 //*******************************************************************************************
807 /// <summary>
808 /// CalcSumItogo
809 /// </summary>
810 /// <param name="context">Контекст процесса</param>
811 /// <param name="form"></param>
812 public virtual void CalcSumItogo(Context context)
813 {
814 double fullsumcash = context.SumItogoCash;
815 double fullsumpayment = context.SumItogoPayment;
816 double itogocash = 0;
817 double itogopayment = 0;
818 foreach (var row in context.CostItems)
819 {
820 itogocash += row.SumCash;
821 itogopayment += row.SumPayment;
822 }
823 context.SumCash = itogocash;
824 context.SumPayment = itogopayment;
825 context.SumRestCash = fullsumcash - itogocash;
826 context.SumRestPayment = fullsumpayment - itogopayment;
827 }
828
829 /// <summary>
830 /// CheckSpentLimitByCRM
831 /// Проверка допустимости расхода по заявке
832 /// </summary>
833 /// <param name="context">Контекст процесса</param>
834 /// <param name="form"></param>
835 public virtual void CheckSpentLimitByCRM(Context context)
836 {
837 // Варианты ошибок:
838 // сделка нерентабельна
839 // сделка закрыта - расходы запрещены
840 // считаем допустимость предложенного расхода
841 string alert = "";
842 ///(Сумма договора - Ретро)/(Расход + Себестоимость + Сумма для распределения)
843 ///Если < 1,4 - нельзя (запрет) → Сообщение "Сделка не рентабельна"
844 ///Если >= 1,4 - можно
845 ///
846 ///
847 if (context.IsClosed == true)
848 {
849 alert = "Cделка закрыта - расходы запрещены!";
850 }
851 else
852 {
853 if (context.ContractSum != 0)
854 {
855 // считаем расход по заявке уже указанный в таблице
856 double spentinblock = 0;
857 foreach (var row in context.CostItems)
858 {
859 if (row.NumAppCRM == context.NumAppCRM)
860 {
861 spentinblock += row.SumCash + row.SumPayment;
862 }
863 }
864 // считаем коэффициент по формуле
865 double kf = (context.ContractSum - context.SumReturn) / (context.SumSpent + spentinblock + context.CostPrice + context.SumCash / 0.8 + context.SumPayment);
866 if (kf < 1.4)
867 {
868 alert = "Добавление указанного расхода сделает сделку нерентабельной! Добавление расхода запрещено!";
869 }
870 }
871 }
872 context.Alerts_NewBlockRecord = alert;
873 }
874
875 /// <summary>
876 /// UpdateHTMLinBLock
877 /// </summary>
878 /// <param name="context">Контекст процесса</param>
879 /// <param name="form"></param>
880 public virtual void UpdateHTMLinBLock(Context context)
881 {
882 int i = 0;
883 foreach (var row in context.CostItems)
884 {
885 i += 1;
886 string html = @"<table class=""previewtable"" cellpadding=""0"" cellspacing=""0"">
887 <tr class=""header"">";
888 html += @"<td width=""30px"" rowspan=""2"">" + i.ToString() + "</td>";
889 html += @"<td width=""150px"">Кому</td>";
890 switch (context.PaymentWay.Value)
891 {
892 case "Наличный расчет":
893 html += @"<td width=""70px"">НАЛ</td>";
894 break;
895 case "Безналичный расчет":
896 html += @"<td width=""70px"">БЕЗНАЛ</td>";
897 break;
898 case "Наличный+безналичный":
899 html += @"<td width=""70px"">НАЛ</td>";
900 html += @"<td width=""70px"">БЕЗНАЛ</td>";
901 break;
902 }
903 if (context.ChargeType.Value == "На договор")
904 {
905 html += @"<td width=""70px"">Заявка</td>";
906 //html += @"<td width=""300px"">CRM</td>";
907
908 }
909 html += @"<td width=""75px"">Сотрудник</td>";
910 html += @"</tr>
911 <tr>";
912 html += @"<td>" + row.ContractorName + "</td>";
913 switch (context.PaymentWay.Value)
914 {
915 case "Наличный расчет":
916 html += @"<td>" + row.SumCash + "</td>";
917 break;
918 case "Безналичный расчет":
919 html += @"<td>" + row.SumPayment + "</td>";
920 break;
921 case "Наличный+безналичный":
922 html += @"<td>" + row.SumCash + "</td>";
923 html += @"<td>" + row.SumPayment + "</td>";
924 break;
925 }
926 if (context.ChargeType.Value == "На договор")
927 {
928 html += @"<td>" + row.NumAppCRM + "</td>";
929 //html += @"<td>"+row.StampHTML +"</td>";
930 }
931 html += @"<td>" + row.EmployeeWhomPay + "</td>";
932 html += @"</tr>
933 <tr>;
934 </table>";
935 row.HTML = new MvcHtmlString(html);
936 // Теперь делаем таблицу, включающую Штамп
937 html = @"<table class=""previewtable"" cellpadding=""0"" cellspacing=""0"">
938 <tr class=""header"">";
939 html += @"<td width=""30px"" rowspan=""2"">" + i.ToString() + "</td>";
940 html += @"<td width=""150px"">Кому</td>";
941 switch (context.PaymentWay.Value)
942 {
943 case "Наличный расчет":
944 html += @"<td width=""70px"">НАЛ</td>";
945 break;
946 case "Безналичный расчет":
947 html += @"<td width=""70px"">БЕЗНАЛ</td>";
948 break;
949 case "Наличный+безналичный":
950 html += @"<td width=""70px"">НАЛ</td>";
951 html += @"<td width=""70px"">БЕЗНАЛ</td>";
952 break;
953 }
954 if (context.ChargeType.Value == "На договор")
955 {
956 html += @"<td width=""70px"">Заявка</td>";
957 html += @"<td width=""300px"">CRM</td>";
958 }
959 html += @"</tr>
960 <tr>";
961 html += @"<td>" + row.ContractorName + "</td>";
962 switch (context.PaymentWay.Value)
963 {
964 case "Наличный расчет":
965 html += @"<td>" + row.SumCash + "</td>";
966 break;
967 case "Безналичный расчет":
968 html += @"<td>" + row.SumPayment + "</td>";
969 break;
970 case "Наличный+безналичный":
971 html += @"<td>" + row.SumCash + "</td>";
972 html += @"<td>" + row.SumPayment + "</td>";
973 break;
974 }
975 if (context.ChargeType.Value == "На договор")
976 {
977 html += @"<td>" + row.NumAppCRM + "</td>";
978 html += @"<td>" + row.StampHTML + "</td>";
979 }
980 html += @"</tr>
981 </table>";
982 row.HTMLAndStamp = new MvcHtmlString(html);
983 }
984 }
985
986 /// <summary>
987 /// AfterBlockChanged
988 /// </summary>
989 /// <param name="context">Контекст процесса</param>
990 /// <param name="form"></param>
991 public virtual void AfterBlockChanged(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
992 {
993 CalcSumItogo(context);
994 UpdateHTMLinBLock(context);
995 }
996
997 /// <summary>
998 /// FindEmployeeBoss
999 /// </summary>
1000 /// <param name="context">Контекст процесса</param>
1001 /// <param name="form"></param>
1002 public virtual void FindEmployeeBoss(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1003 {
1004 var chiefs = context.Employee.OrganizationItems.ToArray().Union(context.Employee.OrganizationGroups).Select(organizationItem =>
1005 {
1006 var parentOrganizationItem = organizationItem.ParentItem;
1007 while (parentOrganizationItem != null && parentOrganizationItem.User == null)
1008 parentOrganizationItem = parentOrganizationItem.ParentItem;
1009 return parentOrganizationItem != null ? parentOrganizationItem.User : null;
1010 }).Where(u => u != null);
1011 if (!chiefs.Any())
1012 //Если не найдено ни одного элемента организационной структуры (высшее звено)
1013 context.Chief = context.Employee;
1014 //Начальник инициатора - сам инициатор
1015 else//Стандартная ветка
1016 {
1017 var chief = chiefs.First();
1018 context.Chief = chief;
1019 }
1020 // Если руководитель = Ихсан, то меняем на Воробьеву
1021 if (context.Chief.EMail == "Bozkurt@serconsrus.com")
1022 {
1023 try
1024 {
1025 // меняем на Воробьеву Кристину
1026 context.Chief = PublicAPI.Portal.Security.User.LoadByLogin("VorobyovaK");
1027 }
1028 catch
1029 {
1030 }
1031 }
1032 }
1033
1034 /// <summary>
1035 /// GetPostForItem
1036 /// Определение ДОЛЖНОСТИ, ФИЛИАЛА, ОТДЕЛА и РУКОВОДИТЕЛЯ для пользователя
1037 /// </summary>
1038 /// <param name="context">Контекст процесса</param>
1039 public virtual void GetPostForItem(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1040 {
1041 OrganizationItem post = null;
1042 if (context.Employee.OrganizationItems.Count > 0 || context.Employee.OrganizationGroups.Count > 0)
1043 {
1044 var posts = context.Employee.OrganizationItems.ToArray().Union(context.Employee.OrganizationGroups);
1045 // пытаемся найти должность из новой оргструктуры
1046 List<long> oldfils = new List<long> {
1047 405,
1048 425,
1049 771
1050 };
1051 foreach (var postitem in posts)
1052 {
1053 Console.WriteLine(postitem.Name);
1054 if (!oldfils.Contains(GetFilialForItem(context, postitem).Id) && post == null)
1055 {
1056 post = postitem;
1057 }
1058 }
1059 // если не нашли из новой, то берем первую имеющуюся
1060 if (post == null)
1061 {
1062 post = posts.FirstOrDefault();
1063 }
1064 OrganizationItem bl = null;
1065 OrganizationItem unit = null;
1066 OrganizationItem filial = null;
1067 OrganizationItem dep = null;
1068 filial = GetFilialForItem(context, post);
1069 Console.WriteLine("Филиал = " + filial.Name);
1070 bl = GetBlockForItem(context, post, filial);
1071 dep = GetDepartmentForItem(context, post, bl);
1072 unit = GetUnitForItem(context, post, dep);
1073 context.Position = post;
1074 context.Chief = PublicAPI.Portal.Security.OrganizationItem.GetChiefByUser(context.Employee).FirstOrDefault();
1075 // Если руководитель = Ихсан, то меняем на Воробьеву
1076 if (context.Chief != null && context.Chief.EMail == "Bozkurt@serconsrus.com")
1077 {
1078 try
1079 {
1080 // меняем на Воробьеву Кристину
1081 context.Chief = PublicAPI.Portal.Security.User.LoadByLogin("VorobyovaK");
1082 }
1083 catch
1084 {
1085 }
1086 }
1087 if (filial != null)
1088 {
1089 context.Filial = GetFilialForItem(context, post);
1090 if (unit != null)
1091 {
1092 context.Unit = unit;
1093 }
1094 else
1095 {
1096 if (dep != null)
1097 {
1098 context.Unit = dep;
1099 }
1100 else
1101 {
1102 context.Unit = bl;
1103 }
1104 }
1105 }
1106 }
1107 }
1108
1109 /// <summary>
1110 /// GetFilialForItem
1111 /// Определение ФИЛИАЛА для элемента оргстуктуры
1112 /// </summary>
1113 /// <param name="context">Контекст процесса</param>
1114 public virtual OrganizationItem GetFilialForItem(Context context, OrganizationItem item)
1115 {
1116 // Филиал - самый верхний - ОК
1117 var Pitem = item;
1118 //string ФилиалСтрока = null;
1119 OrganizationItem Филиал = null;
1120 // Определяем филиал - самый верхний уровень
1121 while (Pitem.ItemType.ToString() != "NestedStructure")
1122 {
1123 if (Pitem.ParentItem != null)
1124 {
1125 Pitem = Pitem.ParentItem;
1126 }
1127 else
1128 {
1129 break;
1130 }
1131 }
1132 if (Pitem.ItemType.ToString() == "NestedStructure")
1133 {
1134 //ФилиалСтрока = Pitem.Name;
1135 Филиал = Pitem;
1136 }
1137 //конец - Определяем филиал
1138 // ********************************************
1139 return Филиал;
1140 }
1141
1142 /// <summary>
1143 /// GetBlockForItem
1144 /// Определение БЛОКА для элемента оргстуктуры
1145 /// </summary>
1146 /// <param name="context">Контекст процесса</param>
1147 public virtual OrganizationItem GetBlockForItem(Context context, OrganizationItem item, OrganizationItem Филиал)
1148 {
1149 // Блок - самый верхний после филиала
1150 OrganizationItem Блок = null;
1151 OrganizationItem Dep = item;
1152 // ********************************************
1153 // Определяем БЛОК - самый верхний уровень после филиала
1154 while (Dep != Филиал)
1155 {
1156 if (Dep.ParentItem != null)
1157 {
1158 if (Dep.ParentItem.ItemType.ToString() == "Department" && Dep.ParentItem != Филиал)
1159 {
1160 Блок = Dep.ParentItem;
1161 }
1162 Dep = Dep.ParentItem;
1163 }
1164 else
1165 {
1166 break;
1167 }
1168 }
1169 return Блок;
1170 }
1171
1172 /// <summary>
1173 /// GetDepartmentForItem
1174 /// Определение Департамента для элемента оргстуктуры
1175 /// </summary>
1176 /// <param name="context">Контекст процесса</param>
1177 public virtual OrganizationItem GetDepartmentForItem(Context context, OrganizationItem item, OrganizationItem Блок)
1178 {
1179 // Департамент - самый верхний после Блока
1180 OrganizationItem Департамент = null;
1181 OrganizationItem Dep = item;
1182 // ********************************************
1183 // Определяем Департамент - самый верхний уровень после филиала
1184 while (Dep != Блок)
1185 {
1186 if (Dep.ParentItem != null)
1187 {
1188 if (Dep.ParentItem.ItemType.ToString() == "Department" && Dep.ParentItem != Блок)
1189 {
1190 Департамент = Dep.ParentItem;
1191 }
1192 Dep = Dep.ParentItem;
1193 }
1194 else
1195 {
1196 break;
1197 }
1198 }
1199 //конец - Департамент
1200 return Департамент;
1201 }
1202
1203 /// <summary>
1204 /// GetUnitForItem
1205 /// Определение Отдела для элемента оргстуктуры
1206 /// </summary>
1207 /// <param name="context">Контекст процесса</param>
1208 public virtual OrganizationItem GetUnitForItem(Context context, OrganizationItem item, OrganizationItem Блок)
1209 {
1210 // Департамент - самый верхний после Блока
1211 OrganizationItem Отдел = null;
1212 OrganizationItem Dep = item;
1213 // ********************************************
1214 // Определяем Департамент - самый верхний уровень после филиала
1215 while (Dep != Блок)
1216 {
1217 if (Dep.ParentItem != null)
1218 {
1219 if (Dep.ParentItem.ItemType.ToString() == "Department" && Dep.ParentItem != Блок)
1220 {
1221 Отдел = Dep.ParentItem;
1222 break;
1223 }
1224 Dep = Dep.ParentItem;
1225 }
1226 else
1227 {
1228 break;
1229 }
1230 }
1231 //конец - Департамент
1232 return Отдел;
1233 }
1234
1235 /// <summary>
1236 /// BeforeTask1Show
1237 /// </summary>
1238 /// <param name="context">Контекст процесса</param>
1239 /// <param name="form"></param>
1240 public virtual void BeforeTask1Show(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1241 {
1242 try
1243 {
1244 form.For(c => c.ChargeGroup).Visible(false);
1245 form.For(c => c.ChargeGroup2).Visible(false);
1246 form.For(c => c.PaymentWay).Visible(false);
1247 form.For(c => c.FileAccount).Visible(false).Required(false);
1248 form.For(c => c.Attachments).Visible(false);
1249 form.For(c => c.NumbersInCRM).Visible(false);
1250 form.For(c => c.CarRef).Visible(false).Required(false);
1251 form.For(c => c.RentContract).Visible(false);
1252 form.For(c => c.MonthPayment).Visible(false);
1253 form.For(c => c.CompanyCar).Visible(false).Required(false);
1254 // сначала скрываем все поля на форме (если пустые)
1255 // if (context.ChargeGroup == null) {
1256 // form.For (c => c.ChargeGroup).Visible (false);
1257 // }
1258 // if (context.ChargeGroup2 == null) {
1259 // form.For (c => c.ChargeGroup2).Visible (false);
1260 // }
1261 // if (context.PaymentWay == null) {
1262 // form.For (c => c.PaymentWay).Visible (false);
1263 // }
1264 // if (context.FileAccount == null) {
1265 // form.For (c => c.FileAccount).Visible (false);
1266 // }
1267 // if (context.Attachments.Count == 0) {
1268 // form.For (c => c.Attachments).Visible (false);
1269 // }
1270 // if (String.IsNullOrWhiteSpace (context.NumbersInCRM)) {
1271 // form.For (c => c.NumbersInCRM).Visible (false);
1272 // }
1273 context.Employee = context.Initiator;
1274 GetPostForItem(context, form);
1275 FindEmployeeBoss(context, form);
1276 //если выбран вид расхода, то показываем группу расходов
1277 if (context.ChargeType != null)
1278 {
1279 // показываем группу расходов
1280 //form.For(c => c.ChargeGroup).Visible(true).Required(true);
1281 // если "на договор" - показываем номера CRM
1282 switch (context.ChargeType.Value)
1283 {
1284 case "На договор":
1285 form.For(c => c.NumbersInCRM).Visible(true).Required(true);
1286 form.For(c => c.ChargeGroup).Visible(true).Required(true);
1287 break;
1288 case "За счет компании":
1289 form.For(c => c.NumbersInCRM).Visible(false);
1290 form.For(c => c.ChargeGroup).Visible(true).Required(true);
1291 break;
1292 }
1293 // если выбрана группа расходов - показываем вид расходов
1294 if (context.ChargeGroup != null)
1295 {
1296 form.For(c => c.ChargeGroup2).Visible(true).Required(true);
1297 if (context.ChargeGroup2 != null)
1298 {
1299 // Делаю видимым поле Группа расходов
1300 form.For(c => c.PaymentWay).Visible(true).Required(true);
1301 // Заполняем выбор значениями, доступными согласно справочника
1302 // Если Расход на протокол, то скрываем поле Номера сделок CRM, показываем Приложения
1303 if (context.ChargeGroup2.Name == "Расходы на протокол")
1304 {
1305 form.For(c => c.Attachments).Visible(true).Required(true);
1306 form.For(c => c.NumbersInCRM).Visible(false).Required(false);
1307 }
1308 // Если выбран способ оплаты - показываем Счет
1309 switch (context.PaymentWay.Value)
1310 {
1311 case "Наличный расчет":
1312 form.For(c => c.FileAccount).Visible(false).Required(false);
1313 context.SumItogoPayment = 0;
1314 break;
1315 case "Безналичный расчет":
1316 form.For(c => c.FileAccount).Visible(true).Required(true);
1317 context.SumItogoCash = 0;
1318 break;
1319 case "Наличный+безналичный":
1320 form.For(c => c.FileAccount).Visible(true).Required(true);
1321 break;
1322 }
1323 // Если обеспечение тендера - то скрываем поле со счетом (нужно будет указать все реквизиты в след. задаче)
1324 if (context.ChargeGroup != null && context.ChargeGroup.Name == "Деньги в пути")
1325 {
1326 form.For(c => c.FileAccount).Visible(false).Required(false);
1327 }
1328 // Если возвраты - то скрываем поле со счетом (нужно будет указать все реквизиты в след. задаче)
1329 if (context.ChargeGroup2 != null && context.ChargeGroup2.Name.Contains("Возврат"))
1330 {
1331 form.For(c => c.FileAccount).Visible(false).Required(false);
1332 }
1333 // Если Расход на протокол, то скрываем поле Номера сделок CRM, показываем Приложения
1334 if (context.ChargeGroup2 != null && context.ChargeGroup2.Name == "Расходы на протокол")
1335 {
1336 form.For(c => c.Attachments).Visible(true).Required(true);
1337 form.For(c => c.NumbersInCRM).Visible(false).Required(false);
1338 }
1339 // Если расходы на Автомобили, то показываем выбор автомобиля
1340 if (context.ChargeGroup2 != null && context.ChargeGroup.Name == "Автомобиль" && !context.ChargeGroup2.Name.Contains("Аренда"))
1341 {
1342 form.For(c => c.CompanyCar).Visible(true).Required(true);
1343 if (context.CompanyCar == true)
1344 {
1345 form.For(c => c.CarRef).Visible(true).Required(true);
1346 }
1347 else
1348 {
1349 context.CarRef = null;
1350 }
1351 }
1352 // Если Аренда
1353 if (context.ChargeGroup2 != null && context.ChargeGroup.Name == "Содержание офиса" && context.ChargeGroup2.Name == "Аренда" && context.Initiator.Id == 26261)
1354 {
1355 form.For(c => c.RentContract).Visible(true);
1356 form.For(c => c.MonthPayment).Visible(true);
1357 }
1358 }
1359 }
1360 }
1361 }
1362 catch (Exception ex)
1363 {
1364 context.EmailTitle = ex.Message;
1365 form.For(x => x.EmailTitle).Visible(true);
1366 }
1367 if (!String.IsNullOrWhiteSpace(context.SumCalcRETROComment))
1368 {
1369 form.Notifier.Error(context.SumCalcRETROComment);
1370 }
1371 }
1372
1373 /// <summary>
1374 /// AfterChangeChargeType
1375 /// </summary>
1376 /// <param name="context">Контекст процесса</param>
1377 /// <param name="form"></param>
1378 public virtual void ChargeType_AfterChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1379 {
1380 // form.For (c => c.ChargeGroup).Visible (true).Required (true);
1381 // form.For (c => c.PaymentWay).Visible (false).Required (false);
1382 // form.For (c => c.ChargeGroup2).Visible (false);
1383 // form.For (c => c.NumbersInCRM).Visible (false);
1384 context.ChargeGroup = null;
1385 context.RentContract = null;
1386 // 1) получить допустимые значения в справочнике "Группа расходов"
1387 string ftype = "True";
1388 // if (context.ChargeType.Value == "За счет компании") {
1389 // ftype = "ByOurCompany";
1390 // form.For (c => c.NumbersInCRM).Visible (false).Required (false);
1391 // }
1392 // else
1393 // if (context.ChargeType.Value == "На договор") {
1394 // ftype = "ByContract";
1395 // form.For (c => c.NumbersInCRM).Visible (true).Required (true);
1396 // }
1397 var filter = PublicAPI.Objects.UserObjects.UserChargeTypes.Filter().Query(ftype + "=true").Filter;
1398 var chgroupsitems = EntityManager<ChargeTypes>.Instance.Find(filter, null);
1399 List<long> chgroups = new List<long>();
1400 string llist = "";
1401 llist += "(";
1402 foreach (var s in chgroupsitems)
1403 {
1404 if (!chgroups.Contains(s.ChargeGroup.Id))
1405 {
1406 chgroups.Add(s.ChargeGroup.Id);
1407 llist += s.ChargeGroup.Id.ToString() + ",";
1408 }
1409 }
1410 llist += "0)";
1411 // 2) проверить, удовлетворяет ли текущее выбранное значение Группа расходов новому условию
1412 // 3) и установить новый фильтр
1413 var settings = (EntitySettings)context.GetSettingsFor(c => c.ChargeGroup);
1414 settings.FilterQuery = "Id in " + llist;
1415 settings.Save();
1416 BeforeTask1Show(context, form);
1417 }
1418
1419 /// <summary>
1420 /// AfterChangePaymentType
1421 /// </summary>
1422 /// <param name="context">Контекст процесса</param>
1423 /// <param name="form"></param>
1424 public virtual void PaymentType_AfterChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1425 {
1426 // if (context.FileAccount != null) {
1427 // form.For (c => c.FileAccount).Visible (true).Required (false);
1428 // }
1429 // else {
1430 // switch (context.PaymentWay.Value) {
1431 // case "Наличный расчет":
1432 // form.For (c => c.FileAccount).Visible (false);
1433 // break;
1434 // case "Безналичный расчет":
1435 // form.For (c => c.FileAccount).Visible (true).Required (true);
1436 // break;
1437 // case "Наличный+безналичный":
1438 // form.For (c => c.FileAccount).Visible (true).Required (true);
1439 // break;
1440 // }
1441 // }
1442 // // Если возвраты то Счет не нужен
1443 // if (context.ChargeGroup2 != null && context.ChargeGroup2.Name.Contains ("Возврат")) {
1444 // form.For (c => c.FileAccount).Visible (false);
1445 // }
1446 // // Если обеспечение тендера - то скрываем поле со счетом (нужно будет указать все реквизиты в след. задаче)
1447 // if (context.ChargeGroup != null && context.ChargeGroup.Name == "Обеспечение тендерных заявок и договоров") {
1448 // form.For (c => c.FileAccount).Visible (false);
1449 // }
1450 BeforeTask1Show(context, form);
1451 // if ((context.PaymentWay.Value == "Безналичный расчет" || context.PaymentWay.Value == "Наличный+безналичный") && !(context.Initiator.Id == 1130 || context.Initiator.Id == 1530 || (context.ChargeGroup != null && context.ChargeGroup.Name == "Обеспечение тендерных заявок и договоров"))) {
1452 // form.Notifier.Warning ("Запуск счетов безналично запрещен в период с 24.12.18 до 08.01.19. При необходимости - согласуйте с Лашковой О.Ф.");
1453 // //return false;
1454 // }
1455 }
1456
1457 /// <summary>
1458 /// ContractorNameAfterChange
1459 /// </summary>
1460 /// <param name="context">Контекст процесса</param>
1461 /// <param name="item"></param>
1462 /// <param name="form"></param>
1463 public virtual void ContractorName_AfterChange_InBlock(Context context, P_ClCash4Contractor_CostItems item, EleWise.ELMA.Model.Views.FormViewBuilder<P_ClCash4Contractor_CostItems> form)
1464 {
1465 var contractor = EntityManager<Contractor>.Instance;
1466 string sql = "";
1467 if (item.ContractorName != null && item.ContractorName.Trim() != "")
1468 {
1469 sql = "Name LIKE '%" + item.ContractorName + "%'";
1470 var contractors = contractor.Find(sql);
1471 if (contractors.Count == 1)
1472 {
1473 item.Contractor = contractors.First();
1474 item.ContractorName = item.Contractor.Name != null ? item.Contractor.Name.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
1475 item.ContractorINN = item.Contractor.INN;
1476 }
1477 else
1478 {
1479 if (contractors.Count == 0)
1480 {
1481 item.AlertMessages = "Найдено 0 значений. Уточните параметры поиска.";
1482 }
1483 else
1484 if (contractors.Count > 1)
1485 {
1486 item.AlertMessages = "Найдено " + contractors.Count.ToString() + " значений. Уточните параметры поиска.";
1487 if (contractors.Count < 5)
1488 {
1489 foreach (var cc in contractors)
1490 {
1491 item.AlertMessages += "\n" + cc.Name;
1492 }
1493 }
1494 }
1495 }
1496 }
1497 }
1498
1499 /// <summary>
1500 /// ContractorINNAfterChange
1501 /// </summary>
1502 /// <param name="context">Контекст процесса</param>
1503 /// <param name="item"></param>
1504 /// <param name="form"></param>
1505 public virtual void ContractorINN_AfterChange_InBlock(Context context, P_ClCash4Contractor_CostItems item, EleWise.ELMA.Model.Views.FormViewBuilder<P_ClCash4Contractor_CostItems> form)
1506 {
1507 var contractor = EntityManager<Contractor>.Instance;
1508 string sql = "";
1509 if (item.ContractorINN != null && item.ContractorINN.Trim() != "")
1510 {
1511 sql = "INN='" + item.ContractorINN + "'";
1512 }
1513 var contractors = contractor.Find(sql);
1514 if (contractors.Count == 1)
1515 {
1516 item.Contractor = contractors.First();
1517 item.ContractorName = item.Contractor.Name != null ? item.Contractor.Name.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
1518 item.ContractorINN = item.Contractor.INN;
1519 item.AlertMessages = "";
1520 }
1521 else
1522 {
1523 if (contractors.Count == 0)
1524 {
1525 item.AlertMessages = "Найдено 0 значений. Уточните параметры поиска.";
1526 }
1527 else
1528 if (contractors.Count > 1)
1529 {
1530 item.AlertMessages = "Найдено " + contractors.Count.ToString() + " значений. Уточните параметры поиска.";
1531 }
1532 }
1533 }
1534
1535 /// <summary>
1536 /// UpdateStampHTML
1537 /// Сформировать штамп
1538 /// </summary>
1539 /// <param name="context">Контекст процесса</param>
1540 /// <param name="form"></param>
1541 string UpdateStampHTMLSmall(CRMData item, Money SumCash, Money SumPayment)
1542 {
1543 string managerFIO = "";
1544 if (item.Manager != null)
1545 {
1546 managerFIO = item.Manager.FullName;
1547 }
1548 else
1549 {
1550 managerFIO = item.ManagerLogin;
1551 }
1552 // считаем допустимость предложенного расхода
1553 //double upper = 0;
1554 string alert = "";
1555 ///(Сумма договора - Ретро)/(Расход + Себестоимость + Сумма для распределения)
1556 ///Если < 1,4 - нельзя (запрет) → Сообщение "Сделка не рентабельна"
1557 ///Если >= 1,4 - можно
1558 if (item.ContractSum != 0)
1559 {
1560 double kf = (item.ContractSum - item.SumReturn) / (item.SumSpent + item.CostPrice + SumCash / 0.8 + SumPayment);
1561 if (kf < 1.4)
1562 {
1563 alert = "Сделка не рентабельна!";
1564 }
1565 }
1566 //item.StampHTML = new MvcHtmlString (
1567 string html = @"<table class=""previewtable_stamp"" cellpadding=""0"" cellspacing=""0"">
1568 <tr>
1569 <td>Менеджер</td>
1570 <td>" + managerFIO + @"</td>
1571 </tr>
1572 <tr>
1573 <td>Вид услуги</td>
1574 <td>" + item.OfferType.ToString() + @"</td>
1575 </tr>
1576 <tr>
1577 <td>Наша компания</td>
1578 <td>" + item.OurCompanyName + @"</td>
1579 </tr>
1580 <tr>
1581 <td>Клиент</td>
1582 <td>" + item.CustomerName + "(" + item.CustomerINN.ToString() + @")</td>
1583 </tr>
1584 <tr>
1585 <td>Сумма договора</td>
1586 <td>" + item.ContractSum.ToString() + " " + item.ContractCurrency.ToString() + @"</td>
1587 </tr>
1588 <tr>
1589 <td>Оплата</td>
1590 <td>" + item.SumPaid.ToString() + @"</td>
1591 </tr>";
1592 if (item.IsPostPayment == true)
1593 {
1594 html += @"<tr>
1595 <td>ПостОплата</td>
1596 <td>" + item.IsPostPayment.ToString() + @"</td>
1597 </tr>";
1598 }
1599 html += @"<tr>
1600 <td>Расход факт.</td>
1601 <td>" + item.SumSpent.ToString() + @"</td>
1602 </tr>
1603 <tr>
1604 <td>Расход план.</td>
1605 <td>" + item.SumSpentPlan.ToString() + @"</td>
1606 </tr>
1607 <tr>
1608 <td>Ретро</td>
1609 <td>" + item.SumReturn.ToString() + @"</td>
1610 </tr>";
1611 if (item.RetroFactSum != 0)
1612 {
1613 html += @"<tr>
1614 <td style='background-color:yellow!important;'>Ретро Факт</td>
1615 <td style='background-color:yellow!important;'>" + item.RetroFactSum.ToString() + " " + item.RetroFactCurrency + @"</td>
1616 </tr>";
1617 }
1618 else
1619 {
1620 html += @"<tr>
1621 <td>Ретро Факт</td>
1622 <td>" + item.RetroFactSum.ToString() + " " + item.RetroFactCurrency + @"</td>
1623 </tr>";
1624 }
1625 html += @"<tr>
1626 <td>Себестоимость</td>
1627 <td>" + item.CostPrice.ToString() + @"</td>
1628 </tr>
1629 <tr>
1630 <td>Документ</td>
1631 <td>" + item.DocState + @"</td>
1632 </tr>
1633 <tr>
1634 <td>Договор</td>
1635 <td>" + item.ContractNumber + " от " + item.ContractDate + @"</td>
1636 </tr>
1637 <tr>
1638 <td>Приложение</td>
1639 <td>" + item.ContractAppendixPosition + @" (дата:" + item.AppendixDate.ToString() + @")</td>
1640 </tr>
1641 <tr>
1642 <td></td>
1643 <td style='background-color:yellow!important;color:red!important;font-width:bold!important;'>" + alert + @"</td>
1644 </tr>
1645 </table>";
1646 //);
1647 //Console.WriteLine(html);
1648 return html;
1649 }
1650
1651 /// <summary>
1652 /// NumCRMAfterChange
1653 /// </summary>
1654 /// <param name="context">Контекст процесса</param>
1655 /// <param name="item"></param>
1656 /// <param name="form"></param>
1657 public virtual void NumCRM_AfterChangeItem(Context context, P_ClCash4Contractor_CostItems item, EleWise.ELMA.Model.Views.FormViewBuilder<P_ClCash4Contractor_CostItems> form)
1658 {
1659 if (item.NumAppCRM != null)
1660 {
1661 CRMData obj = GetContractDataFromTerrasoftCRM(item.NumAppCRM);
1662 //UpdateStampHTMLSmall(context, item);
1663 item.StampHTML = new MvcHtmlString(UpdateStampHTMLSmall(obj, item.SumCash, item.SumPayment));
1664 UpdateHTMLinBLock(context);
1665 }
1666 }
1667
1668 /// <summary>
1669 /// GetDataFromCRMByFieldName
1670 /// </summary>
1671 /// <param name="context">Контекст процесса</param>
1672 /// <param name="form"></param>
1673 public virtual void GetDataFromCRMByFieldName(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1674 {
1675 if (context.NumAppCRM != null)
1676 {
1677 CRMData obj = GetContractDataFromTerrasoftCRM(context.NumAppCRM);
1678 string html = UpdateStampHTMLSmall(obj, context.SumCash, context.SumPayment);
1679 Console.WriteLine(html);
1680 context.StampHTML = new MvcHtmlString(html);
1681 UpdateHTMLinBLock(context);
1682 }
1683 }
1684
1685 /// <summary>
1686 /// ContractorINNAfterChange
1687 /// </summary>
1688 /// <param name="context">Контекст процесса</param>
1689 /// <param name="form"></param>
1690 public virtual void ContractorINN_AfterChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1691 {
1692 var contractor = EntityManager<Contractor>.Instance;
1693 string sql = "";
1694 if (context.ContractorINN != null && context.ContractorINN.Trim() != "")
1695 {
1696 sql = "INN='" + context.ContractorINN + "'";
1697 var contractors = contractor.Find(sql);
1698 if (contractors.Count == 1)
1699 {
1700 context.Contractor = contractors.First();
1701 context.ContractorName = context.Contractor.Name != null ? context.Contractor.Name.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
1702 context.ContractorINN = context.Contractor.INN;
1703 context.ContractorSearchingMessage = "";
1704 }
1705 else
1706 {
1707 if (contractors.Count == 0)
1708 {
1709 context.ContractorSearchingMessage = "Найдено 0 значений. Уточните параметры поиска.";
1710 }
1711 else
1712 if (contractors.Count > 1)
1713 {
1714 context.ContractorSearchingMessage = "Найдено " + contractors.Count.ToString() + " значений. Уточните параметры поиска.";
1715 }
1716 }
1717 }
1718 }
1719
1720 /// <summary>
1721 /// ContractorNameAfterChange
1722 /// </summary>
1723 /// <param name="context">Контекст процесса</param>
1724 /// <param name="form"></param>
1725 public virtual void ContractorName_AfterChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1726 {
1727 var contractor = EntityManager<Contractor>.Instance;
1728 string sql = "";
1729 if (context.ContractorName != null && context.ContractorName.Trim() != "")
1730 {
1731 sql = "Name LIKE '%" + context.ContractorName + "%'";
1732 var contractors = contractor.Find(sql);
1733 if (contractors.Count == 1)
1734 {
1735 context.Contractor = contractors.First();
1736 // context.ContractorName = context.Contractor.Name;
1737 context.ContractorINN = context.Contractor.INN;
1738 }
1739 else
1740 {
1741 if (contractors.Count == 0)
1742 {
1743 context.ContractorSearchingMessage = "Найдено 0 значений. Уточните параметры поиска.";
1744 }
1745 else
1746 if (contractors.Count > 1)
1747 {
1748 context.ContractorSearchingMessage = "Найдено " + contractors.Count.ToString() + " значений. Уточните параметры поиска.";
1749 if (contractors.Count < 5)
1750 {
1751 foreach (var cc in contractors)
1752 {
1753 context.ContractorSearchingMessage += "\n" + cc.Name;
1754 }
1755 }
1756 }
1757 }
1758 }
1759 context.ContractorName = context.ContractorName != null ? context.ContractorName.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
1760 if (context.ChargeType.Value == "На договор")
1761 {
1762 foreach (var row in context.CostItems)
1763 {
1764 // if (row.ContractorName == null || row.ContractorName == "") {
1765 row.ContractorName = context.ContractorName;
1766 // }
1767 }
1768 UpdateHTMLinBLock(context);
1769 }
1770 }
1771
1772 /// <summary>
1773 /// NumCRM_AfterChange
1774 /// </summary>
1775 /// <param name="context">Контекст процесса</param>
1776 /// <param name="form"></param>
1777 public virtual void NumCRM_AfterChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1778 {
1779 CRMData obj = GetContractDataFromTerrasoftCRM(context.NumAppCRM);
1780 // FillContextFieldsAboutCRM (obj, context);
1781 // UpdateStampHTML (context);
1782 CheckNewItemValues(context, form);
1783 }
1784
1785 /// <summary>
1786 /// SumCash_AfterChange
1787 /// </summary>
1788 /// <param name="context">Контекст процесса</param>
1789 /// <param name="form"></param>
1790 public virtual void SumCash_AfterChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1791 {
1792 // UpdateStampHTML (context);
1793 CheckNewItemValues(context, form);
1794 // если в блоке только единственная запись, то сразу заполняем сумму
1795 if (context.CostItems.Count == 1)
1796 {
1797 foreach (var row in context.CostItems)
1798 {
1799 row.SumCash = context.SumItogoCash;
1800 }
1801 }
1802 }
1803
1804 /// <summary>
1805 /// SumPayment_AfterChange
1806 /// </summary>
1807 /// <param name="context">Контекст процесса</param>
1808 /// <param name="form"></param>
1809 public virtual void SumPayment_AfterChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1810 {
1811 // UpdateStampHTML (context);
1812 // если в блоке только единственная запись, то сразу заполняем сумму
1813 if (context.CostItems.Count > 0)
1814 {
1815 if (context.CostItems.Count == 1)
1816 {
1817 foreach (var row in context.CostItems)
1818 {
1819 row.SumPayment = context.SumItogoPayment;
1820 }
1821 }
1822 CheckNewItemValues(context, form);
1823 }
1824 }
1825
1826 /// <summary>
1827 /// SumItogo_AfterChange
1828 /// </summary>
1829 /// <param name="context">Контекст процесса</param>
1830 /// <param name="form"></param>
1831 public virtual void SumItogo_AfterChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1832 {
1833 if (context.CostItems.Count > 0)
1834 {
1835 // если в блоке только единственная запись, то сразу заполняем сумму
1836 if (context.CostItems.Count == 1)
1837 {
1838 foreach (var row in context.CostItems)
1839 {
1840 row.SumPayment = context.SumItogoPayment;
1841 row.SumCash = context.SumItogoCash;
1842 }
1843 }
1844 CalcSumItogo(context);
1845 CheckNewItemValues(context, form);
1846 }
1847 }
1848
1849 /// <summary>
1850 /// CheckNewItemValues
1851 /// </summary>
1852 /// <param name="context">Контекст процесса</param>
1853 /// <param name="form"></param>
1854 public virtual void CheckNewItemValues(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1855 {
1856 context.Alerts_NewBlockRecord = "";
1857 // Сначала проверяем на корректность сумм по заявкам - превышение допустимого лимита
1858 CheckSpentLimitByCRM(context);
1859 // Проверка заполнения полей
1860 // Если наличные, то должны быть указаны сумма наличных и контрагент
1861 // Если безналичные, то должны быть указаны сумма безналичных и контрагент Название
1862 switch (context.PaymentWay.Value)
1863 {
1864 case "Наличный расчет":
1865 if (context.ContractorFLName == "" || context.ContractorFLName == null)
1866 {
1867 context.Alerts_NewBlockRecord += "\nНе указан контрагент";
1868 }
1869 if (context.SumCash == 0)
1870 {
1871 context.Alerts_NewBlockRecord += "\nНе указана сумма";
1872 }
1873 else
1874 {
1875 if (context.SumRestCash < context.SumCash)
1876 {
1877 context.Alerts_NewBlockRecord += "Указанная сумма превышает остаток к распределению! Уменьшите значение суммы к распределению либо увеличите запрашиваемую итоговую сумму!";
1878 }
1879 }
1880 break;
1881 case "Безналичный расчет":
1882 if (context.SumPayment == 0)
1883 {
1884 context.Alerts_NewBlockRecord += "\nНе указана сумма";
1885 }
1886 else
1887 {
1888 if (context.SumRestPayment < context.SumPayment)
1889 {
1890 context.Alerts_NewBlockRecord += "Указанная сумма превышает остаток к распределению! Уменьшите значение суммы к распределению либо увеличите запрашиваемую итоговую сумму!";
1891 }
1892 }
1893 if (context.ContractorName == "" || context.ContractorName == null)
1894 {
1895 context.Alerts_NewBlockRecord += "\nНе указан контрагент";
1896 }
1897 break;
1898 case "Наличный+безналичный":
1899 if (context.SumPayment == 0 && context.SumCash == 0)
1900 {
1901 context.Alerts_NewBlockRecord += "\nНе указана сумма";
1902 }
1903 else
1904 {
1905 if (context.SumPayment > 0 && context.SumRestPayment < context.SumPayment)
1906 {
1907 context.Alerts_NewBlockRecord += "Указанная сумма безнал. превышает остаток к распределению! Уменьшите значение суммы к распределению либо увеличите запрашиваемую итоговую сумму!";
1908 }
1909 if (context.SumCash > 0 && context.SumRestCash < context.SumCash)
1910 {
1911 context.Alerts_NewBlockRecord += "Указанная сумма наличных превышает остаток к распределению! Уменьшите значение суммы к распределению либо увеличите запрашиваемую итоговую сумму!";
1912 }
1913 }
1914 if (context.ContractorName == "" || context.ContractorName == null)
1915 {
1916 context.Alerts_NewBlockRecord += "\nНе указан контрагент";
1917 }
1918 break;
1919 }
1920 switch (context.ChargeType.Value)
1921 {
1922 case "На договор":
1923 if (context.NumAppCRM == null)
1924 {
1925 context.Alerts_NewBlockRecord += "\nНе указана заявка";
1926 }
1927 else
1928 {
1929 if (context.ContractSum == 0)
1930 {
1931 context.Alerts_NewBlockRecord += "\nУ договора в CRM не указана сумма";
1932 }
1933 if (context.IsClosed == true)
1934 {
1935 context.Alerts_NewBlockRecord += "\nСделка закрыта в CRM, расходы запрещены!";
1936 }
1937 }
1938 break;
1939 case "За счет компании":
1940 break;
1941 }
1942 }
1943
1944 /// <summary>
1945 /// BeforeTask2Show
1946 /// </summary>
1947 /// <param name="context">Контекст процесса</param>
1948 /// <param name="form"></param>
1949 public virtual void BeforeTask2Show(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
1950 {
1951 //context.Employee = context.Initiator;
1952 //GetPostForItem (context, form);
1953 //FindEmployeeBoss (context, form);
1954 // form.For (c => c.ContractorSearchingMessage).Visible (false);
1955 // form.For (c => c.FileAccount).Visible (false);
1956 // PaymentType_AfterChange (context, form);
1957 // ChargeType_AfterChange (context, form);
1958 // Анализируем результаты распознавания счета
1959 context.Contractor = null;
1960 if (context.AccountParseResult == true)
1961 {
1962 /*if (context.ContractorINN != null) {
1963 ContractorINN_AfterChange (context, form);
1964 }
1965 if (context.Contractor == null && context.ContractorName != null) {
1966 ContractorName_AfterChange (context, form);
1967 }*/// Определяем нашу компанию по ИНН
1968 if (context.OurCompany == null && context.INNOurCompany != null)
1969 {
1970 var mylegalperson = EntityManager<MyLegalPerson>.Instance;
1971 string sql = "";
1972 sql = "INN='" + context.INNOurCompany + "'";
1973 var ourcompany = mylegalperson.Find(sql);
1974 if (ourcompany.Count == 1)
1975 {
1976 context.OurCompany = ourcompany.FirstOrDefault();
1977 }
1978 }
1979 }
1980 }
1981
1982 /// <summary>
1983 /// CreateDock
1984 /// </summary>
1985 /// <param name="context">Контекст процесса</param>
1986 public virtual void CreateDock(Context context)
1987 {
1988 //Новый документ
1989 var doc = InterfaceActivator.Create<ExternalPayment>();
1990 //Определяем папку
1991 doc.Folder = (Folder)FolderManager.Instance.Load(2);
1992 //Формируем версию
1993 var version = InterfaceActivator.Create<DocumentVersion>();
1994 version.Document = doc;
1995 doc.Versions.Add(version);
1996 //Устанавливаем статус версии - Текущая
1997 version.Status = DocumentVersionStatus.Current;
1998 // Прикрепляем файл версии
1999 version.File = context.DocumentFile;
2000 //Задаем название
2001 doc.Name = context.WorkflowInstance.Name;
2002 //Для формирования названия из шаблона
2003 //doc.Name = DocumentManager.Instance.GenerateName(doc, null, true);
2004 //Сохраняем
2005 doc.Save();
2006 // Сопоставляем созданный документ с контекстной переменной процесса
2007 context.DocumentExternalPayment = (ExternalPayment)doc;
2008 }
2009
2010 public void GenerateFile(Context context)
2011 {
2012 // ****************************************
2013 // Обновляю данные по сделкам в блоке
2014 if (context.ChargeType != null && context.ChargeType.Value == "На договор")
2015 {
2016 if (context.CostItems.Count == 0 && !String.IsNullOrWhiteSpace(context.NumbersInCRM))// если блок еще не заполнен - парсим номера заявок и достаем данные из CRM
2017 {
2018 ParseNumbersCRM(context);
2019 }
2020 }
2021 //*******************************************************
2022 // НАЧАЛО ****************** ГЕНЕРАЦИЯ СЛУЖЕБКИ *************************
2023 // 1) Генерация файла версии по шаблону, file - Это сгенерированный Word-документ служебки
2024 int id_doc = 155243;
2025 //int id_doc = 343054;
2026 //идентификатор документа, в котором содержится шаблон
2027 var versionFile = Locator.GetServiceNotNull<IDocumentFileManager>().GetFileByDocumentId(id_doc);
2028 var file = Locator.GetServiceNotNull<ITemplateFileManager>().CreateFromTemplate(versionFile.Id);
2029 context.ContractorName = context.ContractorName != null ? context.ContractorName.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
2030 PublicAPI.Services.DocumentGenerator.Generate(file, context);
2031 PublicAPI.Services.File.SaveFile(file);
2032 // 2) преобразовываем документ в pdf
2033 //if (System.IO.File.Exists(@"c:\\Служебная записка на оплату.pdf")) System.IO.File.Delete(@"c:\\Служебная записка на оплату.pdf");
2034 context.DocumentFile = InterfaceActivator.Create<BinaryFile>();
2035 context.DocumentFile.Name = "Служебная записка на оплату.pdf";
2036 context.DocumentFile.CreateDate = DateTime.Now;
2037 context.DocumentFile.InitializeContentFilePath();
2038 // сохраняю сгенерированный Word документ в PDF формат
2039 Aspose.Words.Document wordpdf = new Aspose.Words.Document(file.ContentFilePath);
2040 wordpdf.Save(context.DocumentFile.ContentFilePath, Aspose.Words.SaveFormat.Pdf);
2041 var pdf = new Aspose.Pdf.Document(context.DocumentFile.ContentFilePath);
2042 // КОНЕЦ ****************** ГЕНЕРАЦИЯ СЛУЖЕБКИ *************************
2043 // 3) Если есть счет, то добавляем его в документ со служебкой
2044 // var tmpaccfile = InterfaceActivator.Create<BinaryFile> ();
2045 // tmpaccfile.Name = "tmp.pdf";
2046 // tmpaccfile.InitializeContentFilePath ();
2047 // if (context.FileAccountPDF != null && System.IO.File.Exists (context.FileAccountPDF.ContentFilePath)) {
2048 // System.IO.File.Copy (context.FileAccountPDF.ContentFilePath, tmpaccfile.ContentFilePath);
2049 // }
2050 // else if (context.FileAccount != null && System.IO.File.Exists (context.FileAccount.ContentFilePath)) {
2051 // Console.WriteLine ("тип вложения: " + context.FileAccount.ContentType);
2052 // var tmpaccfile = InterfaceActivator.Create<BinaryFile> ();
2053 // tmpaccfile.Name = "tmp.pdf";
2054 // tmpaccfile.InitializeContentFilePath ();
2055 /// Форматы:
2056 /// application/pdf,
2057 /// image/jpeg,
2058 /// application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
2059 /// application/vnd.ms-excel
2060 // Если счет - не pdf, а изображение - конвертируем в pdf
2061 // if (context.FileAccount.ContentType.Contains ("image")) {
2062 // Console.WriteLine ("case = image");
2063 // // Если не pdf, то сначала конвертируем в pdf
2064 // var imagepdf = new Aspose.Pdf.Document ();
2065 // // add page to pages collection of document instance
2066 // imagepdf.Pages.Add ();
2067 // Aspose.Pdf.Image image = new Aspose.Pdf.Image ();
2068 // FileStream imageStream = new FileStream (context.FileAccount.ContentFilePath, FileMode.Open);
2069 // // create Bitmap image so we can get image information
2070 // image.ImageStream = imageStream;
2071 // // add image to pagaraphs collection of first page
2072 // imagepdf.Pages [1].Paragraphs.Add (image);
2073 // imagepdf.Pages [1].PageInfo.Margin.Left = 1;
2074 // imagepdf.Pages [1].PageInfo.Margin.Top = 1;
2075 // imagepdf.Pages [1].PageInfo.Margin.Bottom = 1;
2076 // imagepdf.Pages [1].PageInfo.Margin.Right = 1;
2077 // imagepdf.Save (tmpaccfile.ContentFilePath, Aspose.Pdf.SaveFormat.Pdf);
2078 // Console.WriteLine ("Счет-картинка сохранен в pdf: " + tmpaccfile.ContentFilePath);
2079 // //account_pdf = new Aspose.Pdf.Document(tmpaccfile.ContentFilePath);
2080 // }
2081 // // Если Excel
2082 // else
2083 // if (context.FileAccount.ContentType.Contains ("ms-excel") || context.FileAccount.ContentType.Contains ("officedocument.spreadsheetml.sheet")) {
2084 // Console.WriteLine ("case = excel");
2085 // var tmpfile = InterfaceActivator.Create<BinaryFile> ();
2086 // tmpfile.Name = "tmp.pdf";
2087 // tmpfile.InitializeContentFilePath ();
2088 // Aspose.Cells.Workbook excelpdf = new Aspose.Cells.Workbook (context.FileAccount.ContentFilePath);
2089 // excelpdf.Save (tmpaccfile.ContentFilePath, Aspose.Cells.SaveFormat.Pdf);
2090 // //account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
2091 // //Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
2092 // if (System.IO.File.Exists (tmpfile.ContentFilePath))
2093 // System.IO.File.Delete (tmpfile.ContentFilePath);
2094 // }
2095 // else {
2096 // Console.WriteLine ("case = other");
2097 // //Console.WriteLine("попытка создать pdf из файла "+context.FileAccount.ContentFilePath);
2098 // System.IO.File.Copy (context.FileAccount.ContentFilePath, tmpaccfile.ContentFilePath);
2099 // }
2100 // Берем файл из context.FileAccountPDF
2101 // System.IO.File.Copy (context.FileAccount.ContentFilePath, tmpaccfile.ContentFilePath);
2102 // }
2103 // if (System.IO.File.Exists (tmpaccfile.ContentFilePath)) {
2104 // // используя полученный файл счета в PDF объединяем его с документом служебки
2105 // Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document (tmpaccfile.ContentFilePath);
2106 // // Добавляем страницы счета к служебке
2107 // for (int i = 0; i < account_pdf.Pages.Count; i++) {
2108 // pdf.Pages.Add (account_pdf.Pages [i + 1]);
2109 // }
2110 // pdf.Save (context.DocumentFile.ContentFilePath);
2111 // }
2112 // НАЧАЛО ****************** ОБЪЕДИНЕНИЕ С ВЛОЖЕНИЯМИ *************************
2113 // добавляем к версии счет
2114 if (context.FileAccount != null && System.IO.File.Exists(context.FileAccount.ContentFilePath))
2115 {
2116 BinaryFile file_account = ConvertBinaryFileToPDF(context.FileAccount);
2117 // используя полученный файл счета в PDF объединяем его с документом служебки
2118 Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document(file_account.ContentFilePath);
2119 // Добавляем страницы счета к служебке
2120 for (int i = 0; i < account_pdf.Pages.Count; i++)
2121 {
2122 pdf.Pages.Add(account_pdf.Pages[i + 1]);
2123 }
2124 pdf.Save(context.DocumentFile.ContentFilePath);
2125 }
2126 // добавляем к версии договор
2127 if (context.ContractDocument != null && System.IO.File.Exists(context.ContractDocument.File.ContentFilePath))
2128 {
2129 BinaryFile file_contract = ConvertBinaryFileToPDF(context.ContractDocument.File);
2130 // используя полученный файл счета в PDF объединяем его с документом служебки
2131 Aspose.Pdf.Document contract_pdf = new Aspose.Pdf.Document(file_contract.ContentFilePath);
2132 // Добавляем страницы счета к служебке
2133 for (int i = 0; i < contract_pdf.Pages.Count; i++)
2134 {
2135 pdf.Pages.Add(contract_pdf.Pages[i + 1]);
2136 }
2137 pdf.Save(context.DocumentFile.ContentFilePath);
2138 }
2139 // добавляем к версии приложения
2140 if (context.Attachments.Count > 0)
2141 {
2142 foreach (var attachment in context.Attachments)
2143 {
2144 if (System.IO.File.Exists(attachment.File.ContentFilePath))
2145 {
2146 BinaryFile file_att = ConvertBinaryFileToPDF(attachment.File);
2147 // используя полученный файл счета в PDF объединяем его с документом служебки
2148 Aspose.Pdf.Document att_pdf = new Aspose.Pdf.Document(file_att.ContentFilePath);
2149 // Добавляем страницы счета к служебке
2150 for (int i = 0; i < att_pdf.Pages.Count; i++)
2151 {
2152 pdf.Pages.Add(att_pdf.Pages[i + 1]);
2153 }
2154 pdf.Save(context.DocumentFile.ContentFilePath);
2155 }
2156 }
2157 }
2158 // КОНЕЦ ****************** ОБЪЕДИНЕНИЕ С ВЛОЖЕНИЯМИ *************************
2159 Locator.GetServiceNotNull<IFileManager>().SaveFile(context.DocumentFile);
2160 var doc = context.DocumentExternalPayment;
2161 //Формируем версию
2162 var version = InterfaceActivator.Create<DocumentVersion>();
2163 version.Document = doc;
2164 doc.Versions.Add(version);
2165 version.Status = DocumentVersionStatus.Current;
2166 //version.File = context.DocumentFile;
2167 version.File = context.DocumentFile;
2168 }
2169
2170 /// <summary>
2171 /// GenerateDocument
2172 /// </summary>
2173 /// <param name="context">Контекст процесса</param>
2174 public virtual void GenerateDocument(Context context)
2175 {
2176 // Генерация документа "Служебная записка"
2177 // Если документ уже есть - то используем его, если пустой - создаем новый
2178 var doc = new ExternalPayment();
2179 if (context.DocumentExternalPayment != null)
2180 {
2181 //НЕ Новый документ
2182 doc = context.DocumentExternalPayment;
2183 }
2184 else
2185 {
2186 //Новый документ
2187 doc = InterfaceActivator.Create<ExternalPayment>();
2188 doc.Folder = (Folder)FolderManager.Instance.Load(155241);
2189 }
2190 // //Формируем версию
2191 // var version = InterfaceActivator.Create<DocumentVersion> ();
2192 // version.Document = doc;
2193 // doc.Versions.Add (version);
2194 // version.Status = DocumentVersionStatus.Current;
2195 // //version.File = context.DocumentFile;
2196 // version.File = context.DocumentFile;
2197 doc.SumCash = context.SumItogoCash;
2198 doc.SumPayment = context.SumItogoPayment;
2199 doc.ContractorName = context.ContractorName != null ? context.ContractorName.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
2200 if (context.OurCompany != null)
2201 {
2202 doc.OurCompanyName = context.OurCompany.Name;
2203 }
2204 //Задаем название
2205 if (context.WorkflowInstance != null)
2206 {
2207 doc.Name = context.WorkflowInstance.Name;
2208 }
2209 else
2210 {
2211 doc.Name = "Служебная записка";
2212 }
2213 //Для формирования названия из шаблона
2214 doc.Name = DocumentManager.Instance.GenerateName(doc, null, true);
2215 //Сохраняем
2216 doc.Save();
2217 // Сопоставляем созданный документ с контекстной переменной процесса
2218 context.DocumentExternalPayment = (ExternalPayment)doc;
2219 context.DocumentExternalPayment.Name = DocumentManager.Instance.GenerateName(doc, null, true);
2220 context.DocumentExternalPayment.Save();
2221 //context.DocumentExternalPayment.InheritPermissions
2222 }
2223
2224 /// <summary>
2225 /// GenerateNewVersion
2226 /// </summary>
2227 /// <param name="context">Контекст процесса</param>
2228 public virtual void GenerateNewVersion(Context context)
2229 {
2230 //Генерируем новую версию и записываем в существующий документ обновленные данные и новую версию
2231 // НАЧАЛО ****************** ГЕНЕРАЦИЯ СЛУЖЕБКИ *************************
2232 // Генерация файла версии по шаблону
2233 int id_doc = 155243;
2234 //идентификатор документа, в котором содержится шаблон
2235 var versionFile = Locator.GetServiceNotNull<IDocumentFileManager>().GetFileByDocumentId(id_doc);
2236 var file = Locator.GetServiceNotNull<ITemplateFileManager>().CreateFromTemplate(versionFile.Id);
2237 // Генерируем файл по контексту процесса
2238 context.ContractorName = context.ContractorName != null ? context.ContractorName.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
2239 PublicAPI.Services.DocumentGenerator.Generate(file, context);
2240 // Сохраняем файл сгенерированного документа
2241 PublicAPI.Services.File.SaveFile(file);
2242 /**********/
2243 context.DocumentFile = InterfaceActivator.Create<BinaryFile>();
2244 context.DocumentFile.Name = "Служебная записка на оплату.pdf";
2245 context.DocumentFile.CreateDate = DateTime.Now;
2246 context.DocumentFile.InitializeContentFilePath();
2247 // сохраняю сгенерированный Word документ в PDF формат
2248 Aspose.Words.Document wordpdf = new Aspose.Words.Document(file.ContentFilePath);
2249 wordpdf.Save(context.DocumentFile.ContentFilePath, Aspose.Words.SaveFormat.Pdf);
2250 // объявляем временный документ pdf, с которым будем работать
2251 var pdf = new Aspose.Pdf.Document(context.DocumentFile.ContentFilePath);
2252 // КОНЕЦ ****************** ГЕНЕРАЦИЯ СЛУЖЕБКИ *************************
2253 // 3) Если есть счет, то добавляем его в документ со служебкой
2254 // var tmpaccfile = InterfaceActivator.Create<BinaryFile> ();
2255 // tmpaccfile.Name = "tmp.pdf";
2256 // tmpaccfile.InitializeContentFilePath ();
2257 // if (context.FileAccountPDF != null) {
2258 // System.IO.File.Copy (context.FileAccountPDF.ContentFilePath, tmpaccfile.ContentFilePath);
2259 // }
2260 // else {
2261 // if (context.FileAccount != null) {
2262 // Console.WriteLine ("тип вложения: " + context.FileAccount.ContentType);
2263 // /// Форматы:
2264 // /// application/pdf,
2265 // /// image/jpeg,
2266 // /// application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
2267 // /// application/vnd.ms-excel
2268 // // Если счет - не pdf, а изображение - конвертируем в pdf
2269 // if (context.FileAccount.ContentType.Contains ("image")) {
2270 // Console.WriteLine ("case = image");
2271 // // Если не pdf, то сначала конвертируем в pdf
2272 // var imagepdf = new Aspose.Pdf.Document ();
2273 // // add page to pages collection of document instance
2274 // imagepdf.Pages.Add ();
2275 // Aspose.Pdf.Image image = new Aspose.Pdf.Image ();
2276 // FileStream imageStream = new FileStream (context.FileAccount.ContentFilePath, FileMode.Open);
2277 // // create Bitmap image so we can get image information
2278 // image.ImageStream = imageStream;
2279 // // add image to pagaraphs collection of first page
2280 // imagepdf.Pages [1].Paragraphs.Add (image);
2281 // imagepdf.Pages [1].PageInfo.Margin.Left = 1;
2282 // imagepdf.Pages [1].PageInfo.Margin.Top = 1;
2283 // imagepdf.Pages [1].PageInfo.Margin.Bottom = 1;
2284 // imagepdf.Pages [1].PageInfo.Margin.Right = 1;
2285 // imagepdf.Save (tmpaccfile.ContentFilePath, Aspose.Pdf.SaveFormat.Pdf);
2286 // Console.WriteLine ("Счет-картинка сохранен в pdf: " + tmpaccfile.ContentFilePath);
2287 // //account_pdf = new Aspose.Pdf.Document(tmpaccfile.ContentFilePath);
2288 // }
2289 // // Если Excel
2290 // else
2291 // if (context.FileAccount.ContentType.Contains ("ms-excel") || context.FileAccount.ContentType.Contains ("officedocument.spreadsheetml.sheet")) {
2292 // Console.WriteLine ("case = excel");
2293 // var tmpfile = InterfaceActivator.Create<BinaryFile> ();
2294 // tmpfile.Name = "tmp.pdf";
2295 // tmpfile.InitializeContentFilePath ();
2296 // Aspose.Cells.Workbook excelpdf = new Aspose.Cells.Workbook (context.FileAccount.ContentFilePath);
2297 // excelpdf.Save (tmpaccfile.ContentFilePath, Aspose.Cells.SaveFormat.Pdf);
2298 // //account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
2299 // //Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
2300 // if (System.IO.File.Exists (tmpfile.ContentFilePath))
2301 // System.IO.File.Delete (tmpfile.ContentFilePath);
2302 // }
2303 // else {
2304 // Console.WriteLine ("case = other");
2305 // //Console.WriteLine("попытка создать pdf из файла "+context.FileAccount.ContentFilePath);
2306 // System.IO.File.Copy (context.FileAccount.ContentFilePath, tmpaccfile.ContentFilePath);
2307 // }
2308 // // используя полученный файл счета в PDF объединяем его с документом служебки
2309 // Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document (tmpaccfile.ContentFilePath);
2310 // // Добавляем страницы счета к служебке
2311 // for (int i = 0; i < account_pdf.Pages.Count; i++) {
2312 // pdf.Pages.Add (account_pdf.Pages [i + 1]);
2313 // }
2314 // pdf.Save (context.DocumentFile.ContentFilePath);
2315 // }
2316 // }
2317 // if (System.IO.File.Exists (tmpaccfile.ContentFilePath)) {
2318 // // используя полученный файл счета в PDF объединяем его с документом служебки
2319 // Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document (tmpaccfile.ContentFilePath);
2320 // // Добавляем страницы счета к служебке
2321 // for (int i = 0; i < account_pdf.Pages.Count; i++) {
2322 // pdf.Pages.Add (account_pdf.Pages [i + 1]);
2323 // }
2324 // pdf.Save (context.DocumentFile.ContentFilePath);
2325 // }
2326 // НАЧАЛО ****************** ОБЪЕДИНЕНИЕ С ВЛОЖЕНИЯМИ *************************
2327 // добавляем к версии счет
2328 if (context.FileAccount != null && System.IO.File.Exists(context.FileAccount.ContentFilePath))
2329 {
2330 BinaryFile file_account = ConvertBinaryFileToPDF(context.FileAccount);
2331 // используя полученный файл счета в PDF объединяем его с документом служебки
2332 Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document(file_account.ContentFilePath);
2333 // Добавляем страницы счета к служебке
2334 for (int i = 0; i < account_pdf.Pages.Count; i++)
2335 {
2336 pdf.Pages.Add(account_pdf.Pages[i + 1]);
2337 }
2338 pdf.Save(context.DocumentFile.ContentFilePath);
2339 }
2340 // добавляем к версии договор
2341 if (context.ContractDocument != null && System.IO.File.Exists(context.ContractDocument.File.ContentFilePath))
2342 {
2343 BinaryFile file_contract = ConvertBinaryFileToPDF(context.ContractDocument.File);
2344 // используя полученный файл счета в PDF объединяем его с документом служебки
2345 Aspose.Pdf.Document contract_pdf = new Aspose.Pdf.Document(file_contract.ContentFilePath);
2346 // Добавляем страницы счета к служебке
2347 for (int i = 0; i < contract_pdf.Pages.Count; i++)
2348 {
2349 pdf.Pages.Add(contract_pdf.Pages[i + 1]);
2350 }
2351 pdf.Save(context.DocumentFile.ContentFilePath);
2352 }
2353 // добавляем к версии приложения
2354 if (context.Attachments.Count > 0)
2355 {
2356 foreach (var attachment in context.Attachments)
2357 {
2358 if (System.IO.File.Exists(attachment.File.ContentFilePath))
2359 {
2360 BinaryFile file_att = ConvertBinaryFileToPDF(attachment.File);
2361 // используя полученный файл счета в PDF объединяем его с документом служебки
2362 Aspose.Pdf.Document att_pdf = new Aspose.Pdf.Document(file_att.ContentFilePath);
2363 // Добавляем страницы счета к служебке
2364 for (int i = 0; i < att_pdf.Pages.Count; i++)
2365 {
2366 pdf.Pages.Add(att_pdf.Pages[i + 1]);
2367 }
2368 pdf.Save(context.DocumentFile.ContentFilePath);
2369 }
2370 }
2371 }
2372 // КОНЕЦ ****************** ОБЪЕДИНЕНИЕ С ВЛОЖЕНИЯМИ *************************
2373 // Генерация документа "Служебная записка"
2374 var doc = context.DocumentExternalPayment;
2375 //Определяем папку
2376 //doc.Folder = (Folder)FolderManager.Instance.Load(155241);
2377 // http://elma-test.sercons.local:8000/Documents/Folder/View/454905
2378 //Формируем версию
2379 var version = InterfaceActivator.Create<DocumentVersion>();
2380 //version.Document = doc;
2381 version.Document = context.DocumentExternalPayment;
2382 context.DocumentExternalPayment.Versions.Add(version);
2383 //Устанавливаем статус версии - Текущая
2384 version.Status = DocumentVersionStatus.Current;
2385 // Прикрепляем файл версии
2386 version.File = context.DocumentFile;
2387 doc.SumCash = context.SumItogoCash;
2388 doc.SumPayment = context.SumItogoPayment;
2389 doc.ContractorName = context.ContractorName != null ? context.ContractorName.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
2390 if (context.OurCompany != null)
2391 {
2392 doc.OurCompanyName = context.OurCompany.Name;
2393 }
2394 //Задаем название
2395 //doc.Name = context.WorkflowInstance.Name;
2396 //Для формирования названия из шаблона
2397 doc.Name = DocumentManager.Instance.GenerateName(doc, null, true);
2398 //Сохраняем
2399 doc.Save();
2400 //context.Document.Save();
2401 // Сопоставляем созданный документ с контекстной переменной процесса
2402 //context.Document = (ExternalPayment)doc;
2403 }
2404
2405 //---------------------------------------------------НЕТ ССЫЛОК НА СЦЕНАРИЙ В ПРОЦЕССЕ----------------------------------------------------------------
2406 /// <summary>
2407 /// GetResponsiblesUsersToContext
2408 /// </summary>
2409 /// <param name="context">Контекст процесса</param>
2410 // public virtual void GetResponsiblesUsersToContext (Context context)
2411 // {
2412 // // *********************************
2413 // // Очищаем согласующих на случай если это повторно согласование
2414 // context.FilialCurators.Clear ();
2415 // context.ManagersForApprovement.Clear ();
2416 // context.SecurityUsersForApprovement.Clear ();
2417 // context.ChargeTypeApprovementUsers.Clear ();
2418 // context.ResponsiblesBookkeepers.Clear ();
2419 // context.ResponsiblesFinanceDepartment.Clear ();
2420 // // *********************************
2421 // // Ищем согласующих и проверяем условие
2422 // context.AllApproversAreFound = true;
2423 // // Получаем Куратора филиала
2424 // if (context.Filial != null) {
2425 // var row = EntityManager<Branches>.Instance.Find ("LinkOrganizationItem = " + context.Filial.Id);
2426 // if (row.Count > 0 && row.First ().Curators.Count > 0) {
2427 // context.FilialCurators.AddAll (row.First ().Curators);
2428 // }
2429 // }
2430 // // определяем список сотрудников, которым не требуется предв. согласование с менеджерами
2431 // var uu_nonman = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 607");
2432 // List<User> nonmans = new List<User> ();
2433 // foreach (var uun in uu_nonman) {
2434 // nonmans.AddRange (uun.ResponsibleUsers.ToList ());
2435 // }
2436 // if (nonmans.Contains (context.Initiator) == true && (context.ChargeGroup2.NameFull.ToLowerInvariant ().Contains ("субподряд")/*|| context.ChargeGroup2.NameFull.ToLowerInvariant ().Contains ("оборудовани")*/)) {
2437 // Console.WriteLine ("не нужно согласовывать с менеджерами");
2438 // }
2439 // else {
2440 // Console.WriteLine ("нужно согласовывать с менеджерами");
2441 // if (context.CostItems.Count > 0 && context.CostItems.ToList ().Exists (x => x.Manager != null)) {
2442 // context.CostItems.ToList ().ForEach (x => context.ManagersForApprovement.Add (x.Manager));
2443 // }
2444 // }
2445 // // Если указан согласующий от исполнительного блока - добавляем его
2446 // // if (context.ExecutorsForApprovement.Count == 0 && context.ChargeType.Value == "На договор") {
2447 // // context.CostItems.ToList ().ForEach (x => context.ManagersForApprovement.Add (x.Manager));
2448 // // }
2449 // // Служба безопасности
2450 // var uu_sb = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 412");
2451 // if (uu_sb.Count > 0) {
2452 // context.SecurityUsersForApprovement.AddAll (uu_sb.First ().ResponsibleUsers);
2453 // }
2454 // // поиск согласующих по виду расхода
2455 // if (context.ChargeGroup2 != null && context.ChargeGroup2.Users.Count > 0) {
2456 // context.ChargeTypeApprovementUsers.AddAll (context.ChargeGroup2.Users);
2457 // }
2458 // // поиск ответственных по зонам
2459 // // НАЧАЛО *********** БУХГАЛТЕР **********************
2460 // // { 102,"Бухгалтерия" },
2461 // // для Авансов - проверяет Николаева О.
2462 // if (context.ChargeGroup2.Name == "Аванс") {
2463 // var uu102 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 809");
2464 // // проверяющий авансы - Николаева О.
2465 // if (uu102.Count > 0) {
2466 // context.ResponsiblesBookkeepers.AddAll (uu102.First ().ResponsibleUsers);
2467 // }
2468 // }
2469 // else
2470 // if (context.ChargeGroup2.Name == "Аванс %") {
2471 // var uu102 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 910");
2472 // // проверяющий авансы % - Подолян Ю.
2473 // if (uu102.Count > 0) {
2474 // context.ResponsiblesBookkeepers.AddAll (uu102.First ().ResponsibleUsers);
2475 // }
2476 // }
2477 // else// для остальных - проверяет Моторина В.
2478 // {
2479 // var uu102 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 406");
2480 // // проверяющий бухгалтер по всем расходам
2481 // if (uu102.Count > 0) {
2482 // context.ResponsiblesBookkeepers.AddAll (uu102.First ().ResponsibleUsers);
2483 // }
2484 // }
2485 // // КОНЕЦ *********** БУХГАЛТЕР **********************
2486 // // { 103,"ФинОтдел" },
2487 // var uu103 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 407");
2488 // if (uu103.Count > 0) {
2489 // context.ResponsiblesFinanceDepartment.AddAll (uu103.First ().ResponsibleUsers);
2490 // }
2491 // // { 203,"Главный Бухгалтер" },
2492 // // Совместным решением Ихсана и Лошковой О глбухг-ра исключили из согласования
2493 // // var uu203 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 409");
2494 // // if (uu203.Count > 0) {
2495 // // context.ResponsiblesBookkeeperChiefs.AddAll (uu203.First ().ResponsibleUsers);
2496 // // }
2497 // /// **************** ДИРЕКТОР ***************************************************
2498 // //{ 104,"Директор" }
2499 // context.ResponsiblesGeneralDirector.Clear ();
2500 // // Директор 1: сначала директора ищем в справочнике Виды ответственности по совпадению отдела, за которые он отвечает
2501 // var uu104 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 408");
2502 // // 2) ищем все вышестоящие подразделения у выбранного отдела
2503 // List<OrganizationItem> parents = new List<OrganizationItem> ();
2504 // OrganizationItem unit = context.Unit;
2505 // while (unit.ParentItem != null) {
2506 // parents.Add (unit);
2507 // Console.WriteLine (unit.Name);
2508 // unit = unit.ParentItem;
2509 // }
2510 // // 3) сравниваем, если наш отдел содержится у согласующего, то добваляем в поле Согласующие
2511 // if (uu104.Count > 0) {
2512 // // находим все записи с типом "Согласующий директор" и пробегаем по каждой чтобы сравнить с искомым отделом
2513 // foreach (var sdir in uu104) {
2514 // foreach (var sdir_unit in sdir.Units) {
2515 // if (parents.Contains (sdir_unit)) {
2516 // context.ResponsiblesGeneralDirector.AddAll (sdir.ResponsibleUsers);
2517 // Console.WriteLine ("Директор - нашли по отделу ");
2518 // }
2519 // }
2520 // }
2521 // }
2522 // // Директор 2: если для заданного отдела не нашли директора, то берем из справочника Типы расходов
2523 // if (context.ResponsiblesGeneralDirector.Count == 0 && uu104.Count > 0) {
2524 // if (context.ChargeGroup2 != null && context.ChargeGroup2.DirectorZoneUsers.Count > 0) {
2525 // context.ResponsiblesGeneralDirector.AddAll (context.ChargeGroup2.DirectorZoneUsers);
2526 // Console.WriteLine ("Директор - берем из типов расходов - Воробьева");
2527 // }
2528 // }
2529 // // Директор 3: если же и в справочнике Типы расходов не указан директор, то находим директора по умолчанию из справочника Виды ответственности (т.е. у которого не указаны отделы)
2530 // if (context.ResponsiblesGeneralDirector.Count == 0 && uu104.Count > 0) {
2531 // foreach (var sdir in uu104) {
2532 // if (sdir.Units.Count == 0) {
2533 // context.ResponsiblesGeneralDirector.AddAll (sdir.ResponsibleUsers);
2534 // Console.WriteLine ("Директор - берем из видов ответственности для всех (финотдел)");
2535 // }
2536 // }
2537 // }
2538 // // Директор 4: если же ничего не нашли - то без директора (это возможно только в случае если спарвочник не заполнен)
2539 // /// ***************************************************************
2540 // // Бухгалтер по расчетам
2541 // context.Bookkeepers.Clear ();
2542 // var uu204 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 410");
2543 // if (uu204.Count > 0) {
2544 // context.Bookkeepers.AddAll (uu204.First ().ResponsibleUsers);
2545 // }
2546 // // Кассиры
2547 // context.Cashiers.Clear ();
2548 // var uu205 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 411");
2549 // if (uu205.Count > 0) {
2550 // context.Cashiers.AddAll (uu205.First ().ResponsibleUsers);
2551 // }
2552 // // Устанавливаем метку - все ли определены
2553 // // if ((context.FilialCurators.Count == 0 && context.Filial.Name != "Москва") || (context.ManagersForApprovement.Count == 0 && context.ChargeType.Value == "На договор") || context.ChargeTypeApprovementUsers.Count == 0 || context.ChargeTypeApprovementUsers.Count == 0 || context.ResponsiblesBookkeepers.Count == 0 || context.ResponsiblesFinanceDepartment.Count == 0 || context.ResponsiblesBookkeeperChiefs.Count == 0 || context.ResponsiblesGeneralDirector.Count == 0 || context.Bookkeepers.Count == 0 || context.Cashiers.Count == 0) {
2554 // // context.AllApproversAreFound = false;
2555 // // }
2556 // }
2557 //----------------------------------------------------------------------------------------------------------------------------------------------------
2558 /// <summary>
2559 /// CheckIfResposiblesAreCorrect
2560 /// </summary>
2561 /// <param name="context">Контекст процесса</param>
2562 public virtual void CheckIfResposiblesAreCorrect(Context context)
2563 {
2564 // Проверка списков согласующих на замещения и подстановка заместителей
2565 stCheckUserListForReplacements(context, context.FilialCurators);
2566 stCheckUserListForReplacements(context, context.ManagersForApprovement);
2567 stCheckUserListForReplacements(context, context.ChargeTypeApprovementUsers);
2568 stCheckUserListForReplacements(context, context.ResponsiblesGeneralDirector);
2569 stCheckUserListForReplacements(context, context.ExecutorsForApprovement);
2570 // Ищем согласующих и проверяем условие
2571 context.AllApproversAreFound = true;
2572 // Проверяем, является ли инициатор менеджером по продажам - ищем среди вышестоящих подразделений "Группа продаж"
2573 // 1) ищем все вышестоящие подразделения у инициатора (у его должности)
2574 context.InitiatorIsManager = false;
2575 // признак "является ли менеджером"
2576 OrganizationItem unit = context.Position;
2577 // старт поиска начинаем с должности
2578 while (unit.ParentItem != null && context.InitiatorIsManager == false)
2579 {
2580 if (unit.Name == "Группа продаж")
2581 {
2582 context.InitiatorIsManager = true;
2583 }
2584 unit = unit.ParentItem;
2585 }
2586 if (context.Chief == null)
2587 {
2588 context.AllApproversAreFound = false;
2589 Console.WriteLine("Не прошел условие 1");
2590 }
2591 if (context.FilialCurators.Count == 0 && context.Filial.Name != "Москва")
2592 {
2593 context.AllApproversAreFound = false;
2594 Console.WriteLine("Не прошел условие 2");
2595 }
2596 // Нужно ли заполнять менеджеров или согласующих от исполнительного блока
2597 // определяем список сотрудников, которым не требуется предв. согласование с менеджерами
2598 var uu_nonman = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 607");
2599 List<User> nonmans = new List<User>();
2600 foreach (var uun in uu_nonman)
2601 {
2602 nonmans.AddRange(uun.ResponsibleUsers.ToList());
2603 }
2604 if (nonmans.Contains(context.Initiator) == true && (context.ChargeGroup2.NameFull.ToLowerInvariant().Contains("субподряд")/*|| context.ChargeGroup2.NameFull.ToLowerInvariant ().Contains ("оборудовани")*/))
2605 {
2606 Console.WriteLine("не нужно согласовывать ни с менеджерами ни с исп. блоком");
2607 }
2608 else
2609 {
2610 if (context.ChargeType.Value == "На договор")
2611 {
2612 if (context.InitiatorIsManager == false)// если инициатор не является менеджером
2613 {
2614 // Менеджеры
2615 if (context.ManagersForApprovement.Count == 0 && context.ChargeGroup2.Name != "Оплата субподряда Отдел Сопровождение")
2616 {
2617 context.AllApproversAreFound = false;
2618 Console.WriteLine("Не прошел условие 3");
2619 }
2620 }
2621 else// если инициатор является менеджером
2622 {
2623 // Согласующие от исполнительного блока
2624 if (context.ExecutorsForApprovement.Count == 0 && !(context.ChargeGroup2.Name == "Бензин" && context.SumItogoPayment < 2000 && context.SumItogoCash < 2000) && !(context.ChargeGroup2.Name == "Ретро" || context.ChargeGroup2.Name == "Билеты" || context.ChargeGroup2.Name == "Проживание"))
2625 {
2626 context.AllApproversAreFound = false;
2627 Console.WriteLine("Не прошел условие 4");
2628 }
2629 }
2630 }
2631 else// Если за счет компании
2632 {
2633 }
2634 }
2635 // Бухгалтерия
2636 if (context.ResponsiblesBookkeepers.Count == 0)
2637 {
2638 context.AllApproversAreFound = false;
2639 Console.WriteLine("Не прошел условие 5");
2640 }
2641 // Бухгалтер по оплате счетов и кассир
2642 switch (context.PaymentWay.Value)
2643 {
2644 case "Наличный расчет":
2645 // Кассир
2646 if (context.Cashiers.Count == 0)
2647 {
2648 context.AllApproversAreFound = false;
2649 Console.WriteLine("Не прошел условие 6");
2650 }
2651 break;
2652 case "Безналичный расчет":
2653 // Бухгалтер по оплате счетов
2654 if (context.Bookkeepers.Count == 0)
2655 {
2656 context.AllApproversAreFound = false;
2657 Console.WriteLine("Не прошел условие 7");
2658 }
2659 break;
2660 case "Наличный+безналичный":
2661 // Бухгалтер по оплате счетов
2662 if (context.Bookkeepers.Count == 0)
2663 {
2664 context.AllApproversAreFound = false;
2665 Console.WriteLine("Не прошел условие 8");
2666 }
2667 // Кассир
2668 if (context.Cashiers.Count == 0)
2669 {
2670 context.AllApproversAreFound = false;
2671 Console.WriteLine("Не прошел условие 9");
2672 }
2673 break;
2674 }
2675 }
2676
2677 /// <summary>
2678 /// BeforeTask3Show
2679 /// </summary>
2680 /// <param name="context">Контекст процесса</param>
2681 /// <param name="form"></param>
2682 public virtual void BeforeTask3Show(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
2683 {
2684 form.For(c => c.ContractorSearchingMessage).Visible(false);
2685 form.For(c => c.ErrorText).Visible(false).ReadOnly(true);
2686 form.For(c => c.FileAccount).Visible(false).Required(false);
2687 //Скрываем реквизиты
2688 form.For(c => c.ContractorKPP).Visible(false);
2689 form.For(c => c.ContractorAccount).Visible(false);
2690 form.For(c => c.ContractorBankBIK).Visible(false);
2691 form.For(c => c.ContractorBankCorracc).Visible(false);
2692 form.For(c => c.OGRN).Visible(false);
2693 form.For(c => c.OKTMO).Visible(false);
2694 form.For(c => c.OKPO).Visible(false);
2695 form.For(c => c.KBK).Visible(false);
2696 form.For(c => c.AccountPurpose).Visible(false);
2697 form.For(c => c.HasNDS).Visible(false);
2698 form.For(c => c.DateReturnProcuring).Visible(false);
2699 form.For(c => c.ContractDocument).Visible(true).ReadOnly(false);
2700 form.For(c => c.Attachments).Visible(true).ReadOnly(false);
2701 form.For(c => c.SumCalcRETROComment).Visible(false);
2702 if (context.PaymentWay.Value == "Безналичный расчет" || context.PaymentWay.Value == "Наличный+безналичный")
2703 {
2704 if (context.ChargeGroup2 != null && context.ChargeGroup2.Name.Contains("Возврат"))
2705 {
2706 form.For(c => c.ContractorKPP).Visible(true).Required(false);
2707 form.For(c => c.ContractorAccount).Visible(true).Required(true);
2708 form.For(c => c.ContractorBankBIK).Visible(true).Required(true);
2709 form.For(c => c.ContractorBankCorracc).Visible(true).Required(false);
2710 form.For(c => c.OGRN).Visible(true).Required(true);
2711 form.For(c => c.OKTMO).Visible(true).Required(false);
2712 form.For(c => c.OKPO).Visible(true).Required(false);
2713 form.For(c => c.KBK).Visible(true).Required(false);
2714 //form.For (c => c.AccountPurpose).Visible(true).Required(true);
2715 form.For(c => c.ContractDocument).Visible(false);
2716 form.For(c => c.FileAccount).Visible(false).Required(false);
2717 // скрываем договор
2718 }
2719 if (context.ChargeGroup != null && context.ChargeGroup.Name == "Деньги в пути")
2720 {
2721 form.For(c => c.FileAccount).Visible(false).Required(false);
2722 form.For(c => c.ContractorKPP).Visible(true).Required(false);
2723 form.For(c => c.ContractorAccount).Visible(true).Required(true);
2724 form.For(c => c.ContractorBankBIK).Visible(true).Required(true);
2725 form.For(c => c.ContractorBankCorracc).Visible(true).Required(false);
2726 form.For(c => c.OGRN).Visible(true).Required(true);
2727 form.For(c => c.OKTMO).Visible(true).Required(true);
2728 form.For(c => c.OKPO).Visible(true).Required(true);
2729 form.For(c => c.KBK).Visible(true).Required(true);
2730 form.For(c => c.AccountPurpose).Visible(true).Required(false);
2731 form.For(c => c.HasNDS).Visible(true);
2732 form.For(c => c.DateReturnProcuring).Visible(true);
2733 if (context.ChargeGroup2 != null && context.ChargeGroup2.Name.Contains("Обеспечение договора"))
2734 {
2735 form.For(c => c.DateReturnProcuring).Visible(true).Required(true);
2736 }
2737 }
2738 }
2739 else
2740 {
2741 if (context.ChargeGroup != null && context.ChargeGroup.Name == "Деньги в пути")
2742 {
2743 form.For(c => c.DateReturnProcuring).Visible(true);
2744 }
2745 if (context.ChargeGroup2 != null && context.ChargeGroup2.Name.Contains("Возврат"))
2746 {
2747 form.For(c => c.ContractDocument).Visible(false).Required(false);
2748 // скрываем договор для возвратов
2749 }
2750 }
2751 // Пытаемся определить нашу компанию
2752 if (!String.IsNullOrWhiteSpace(context.INNOurCompany) && context.OurCompany == null)
2753 {
2754 var mylegalperson = EntityManager<MyLegalPerson>.Instance;
2755 string sql = "";
2756 sql = "INN='" + context.INNOurCompany + "' AND NonActive <> TRUE";
2757 var ourcompany = mylegalperson.Find(sql);
2758 if (ourcompany.Count == 1)
2759 {
2760 context.OurCompany = ourcompany.FirstOrDefault();
2761 }
2762 }
2763 if (context.ChargeType != null && context.PaymentWay != null)
2764 {
2765 switch (context.ChargeType.Value)
2766 {
2767 case "На договор":
2768 form.For(c => c.NumbersInCRM).Visible(true).ReadOnly(true);
2769 switch (context.PaymentWay.Value)
2770 {
2771 case "Наличный расчет":
2772 form.For(c => c.FileAccount).Visible(false).Required(false);
2773 form.For(c => c.OurCompany).Visible(false).Required(false);
2774 form.For(c => c.ContractorINN).Visible(false).Required(false);
2775 form.For(c => c.ContractorName).Visible(false).Required(false);
2776 form.For(c => c.SumItogoCash).Visible(true).Required(true);
2777 form.For(c => c.SumCash).Visible(true).Required(false);
2778 form.For(c => c.SumRestCash).Visible(true).Required(false);
2779 form.For(c => c.SumItogoPayment).Visible(false).Required(false);
2780 form.For(c => c.SumPayment).Visible(false).Required(false);
2781 form.For(c => c.SumRestPayment).Visible(false).Required(false);
2782 form.For(c => c.CostItems).Visible(true).Required(true);
2783 break;
2784 case "Безналичный расчет":
2785 form.For(c => c.FileAccount).Visible(true).Required(true);
2786 form.For(c => c.OurCompany).Visible(true).Required(true);
2787 form.For(c => c.ContractorINN).Visible(true).Required(true);
2788 form.For(c => c.ContractorName).Visible(true).Required(true);
2789 form.For(c => c.SumItogoCash).Visible(false).Required(true);
2790 form.For(c => c.SumCash).Visible(false).Required(false);
2791 form.For(c => c.SumRestCash).Visible(false).Required(false);
2792 form.For(c => c.SumItogoPayment).Visible(true).Required(true);
2793 form.For(c => c.SumPayment).Visible(true).Required(false);
2794 form.For(c => c.SumRestPayment).Visible(true).Required(false);
2795 form.For(c => c.CostItems).Visible(true).Required(true);
2796 break;
2797 case "Наличный+безналичный":
2798 form.For(c => c.FileAccount).Visible(true).Required(true);
2799 form.For(c => c.OurCompany).Visible(true).Required(true);
2800 form.For(c => c.ContractorINN).Visible(true).Required(true);
2801 form.For(c => c.ContractorName).Visible(true).Required(true);
2802 form.For(c => c.SumItogoCash).Visible(true).Required(true);
2803 form.For(c => c.SumCash).Visible(true).Required(false);
2804 form.For(c => c.SumRestCash).Visible(true).Required(false);
2805 form.For(c => c.SumItogoPayment).Visible(true).Required(true);
2806 form.For(c => c.SumPayment).Visible(true).Required(false);
2807 form.For(c => c.SumRestPayment).Visible(true).Required(false);
2808 form.For(c => c.CostItems).Visible(true).Required(true);
2809 break;
2810 }
2811 break;
2812 case "За счет компании":
2813 form.For(c => c.NumbersInCRM).Visible(false).Required(false);
2814 form.For(c => c.SumRestPayment).Visible(false).Required(false);
2815 form.For(c => c.SumRestCash).Visible(false).Required(false);
2816 form.For(c => c.SumCash).Visible(false).Required(false);
2817 form.For(c => c.SumPayment).Visible(false).Required(false);
2818 switch (context.PaymentWay.Value)
2819 {
2820 case "Наличный расчет":
2821 form.For(c => c.FileAccount).Visible(false).Required(false);
2822 form.For(c => c.OurCompany).Visible(false).Required(false);
2823 form.For(c => c.ContractorINN).Visible(false).Required(false);
2824 form.For(c => c.ContractorName).Visible(false).Required(false);
2825 form.For(c => c.SumItogoCash).Visible(true).Required(true);
2826 form.For(c => c.SumItogoPayment).Visible(false).Required(false);
2827 if (context.ChargeGroup2.Name != "Аванс")
2828 {
2829 form.For(c => c.CostItems).Visible(true).Required(false);
2830 }
2831 break;
2832 case "Безналичный расчет":
2833 form.For(c => c.FileAccount).Visible(true).Required(true);
2834 form.For(c => c.OurCompany).Visible(true).Required(true);
2835 form.For(c => c.ContractorINN).Visible(true).Required(true);
2836 form.For(c => c.ContractorName).Visible(true).Required(true);
2837 form.For(c => c.SumItogoCash).Visible(false).Required(true);
2838 form.For(c => c.SumItogoPayment).Visible(true).Required(true);
2839 form.For(c => c.CostItems).Visible(false).Required(false);
2840 break;
2841 case "Наличный+безналичный":
2842 form.For(c => c.FileAccount).Visible(true).Required(true);
2843 form.For(c => c.OurCompany).Visible(true).Required(true);
2844 form.For(c => c.ContractorINN).Visible(true).Required(true);
2845 form.For(c => c.ContractorName).Visible(true).Required(true);
2846 form.For(c => c.SumItogoCash).Visible(true).Required(true);
2847 form.For(c => c.SumItogoPayment).Visible(true).Required(true);
2848 form.For(c => c.CostItems).Visible(false).Required(false);
2849 break;
2850 }
2851 break;
2852 }
2853 }
2854 else
2855 {
2856 form.Notifier.Error("Вы не указали на первом шаге тип расходов или способ оплаты!");
2857 }
2858 // Если Расход на протокол, то скрываем поле Номера сделок CRM, показываем Приложения
2859 if (context.ChargeGroup2 != null && context.ChargeGroup2.Name == "Расходы на протокол")
2860 {
2861 form.For(c => c.Attachments).Visible(true).Required(true);
2862 form.For(c => c.NumbersInCRM).Visible(false).Required(false);
2863 form.For(c => c.CostItems).Visible(false).Required(false);
2864 form.For(c => c.SumCash).Visible(false).Required(false);
2865 form.For(c => c.SumRestCash).Visible(false).Required(false);
2866 form.For(c => c.SumPayment).Visible(false).Required(false);
2867 form.For(c => c.SumRestPayment).Visible(false).Required(false);
2868 }
2869 if (context.ChargeGroup2 != null && context.ChargeGroup2.Name == "Выписки ЕГРЮЛ,госпошлины, комиссии")
2870 {
2871 form.For(c => c.AccountPurpose).Visible(true).Required(true);
2872 }
2873 // подставляем валюту по умолчанию - рубли
2874 if (context.PaymentCurrency == null)
2875 {
2876 var cur_filter = PublicAPI.CRM.Objects.Currency.Filter().CodeISONumerical(643).Filter;
2877 context.PaymentCurrency = EntityManager<Currency>.Instance.Find(cur_filter, null).FirstOrDefault();
2878 }
2879 // Если РЕТРО, то
2880 // сумма - неизменяемая
2881 // если безнал - обязат-но договор и счет
2882 if (context.ChargeGroup2 != null && context.ChargeGroup2.Name == "Ретро")
2883 {
2884 form.For(c => c.Attachments).Visible(true).Required(true);
2885 // Обязателен акт выполненных работ!
2886 form.For(c => c.NumbersInCRM).Visible(true).Required(true);
2887 form.For(c => c.CostItems).Visible(true).Required(false);
2888 form.For(c => c.SumCash).Visible(false).Required(false);
2889 form.For(c => c.SumRestCash).Visible(false).Required(false);
2890 form.For(c => c.SumPayment).Visible(false).Required(false);
2891 form.For(c => c.SumRestPayment).Visible(false).Required(false);
2892 form.For(c => c.SumCalcRETROComment).Visible(true).ReadOnly(true);
2893 if (context.PaymentWay.Value == "Безналичный расчет" || context.PaymentWay.Value == "Наличный+безналичный")
2894 {
2895 form.For(c => c.ContractDocument).Visible(true).Required(true);
2896 // Обязателен договор
2897 form.For(c => c.FileAccount).Visible(true).Required(true);
2898 form.For(c => c.SumItogoPayment).Visible(true).ReadOnly(true);
2899 // запрещаем редактирование
2900 form.For(c => c.SumItogoCash).Visible(false);
2901 }
2902 else
2903 {
2904 form.For(c => c.SumItogoCash).Visible(true).ReadOnly(true);
2905 // запрещаем редактирование
2906 form.For(c => c.SumItogoPayment).Visible(false);
2907 form.For(c => c.ContractDocument).Visible(true).Required(false);
2908 form.For(c => c.FileAccount).Visible(true).Required(false);
2909 }
2910 CalcRETRO(context, form);
2911 // Расчет сумм РЕТРО
2912 }
2913 }
2914
2915 public virtual void ParseNumbersCRM(Context context)
2916 {
2917 context.SysLog += DateTime.Now.ToShortTimeString() + " старт функции ParseNumbersCRM";
2918 // создаем строки по количеству заявок
2919 // очистим блок
2920 foreach (var row in context.CostItems.ToList())
2921 {
2922 row.Delete();
2923 context.CostItems.Remove(row);
2924 }
2925 context.CRMCustomers = "";
2926 if (!String.IsNullOrWhiteSpace(context.NumbersInCRM))
2927 {
2928 // 1) парсим номера заявок
2929 string[] sdelkasplit = Regex.Split(context.NumbersInCRM, @"\D+");
2930 sdelkasplit = sdelkasplit.Distinct().ToArray();
2931 context.NumbersInCRM = String.Join("; ", sdelkasplit);
2932 // 2) добавляем строки с каждым номером заявки
2933 if (sdelkasplit.ToList().Count > 0)
2934 {
2935 foreach (var sdelka in sdelkasplit)
2936 {
2937 context.SysLog += "ищем в CRM по сделке " + sdelka;
2938 // 1. Считаем суммарный расход по заявке с учетом добавленных сумм: берем сумму из штампа + пробегаем по таблице
2939 var ni = InterfaceActivator.Create<P_ClCash4Contractor_CostItems>();
2940 ni.NumAppCRM = sdelka;
2941 ni.SumCash = 0;
2942 ni.SumPayment = 0;
2943 if (context.ContractorName != null)
2944 {
2945 ni.ContractorName = context.ContractorName != null ? context.ContractorName.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
2946 }
2947 if (sdelkasplit.Count() == 1)
2948 {
2949 if (context.SumItogoPayment > 0)
2950 {
2951 ni.SumPayment = context.SumItogoPayment;
2952 }
2953 if (context.SumItogoCash > 0)
2954 {
2955 ni.SumCash = context.SumItogoCash;
2956 }
2957 }
2958 CRMData obj = GetContractDataFromTerrasoftCRM(sdelka);
2959 ni.ContractSum = obj.ContractSum;
2960 ni.Customer = obj.CustomerName + "(ИНН:" + obj.CustomerINN.ToString() + ")";
2961 ni.CRMOurCompany = obj.OurCompanyName;
2962 ni.CRMOurCompanyINN = obj.OurCompanyINN;
2963 context.CRMCustomers += ni.Customer + "\n";
2964 ni.ContractCurrency = obj.ContractCurrency;
2965 ni.ContractNumber = obj.ContractNumber;
2966 ni.ContractDate = obj.ContractDate;
2967 ni.ContractAppendixPosition = obj.ContractAppendixPosition;
2968 ni.AppendixDate = obj.AppendixDate;
2969 ni.SumPaid = obj.SumPaid;
2970 ni.SumSpent = obj.SumSpent;
2971 // Расход Факт
2972 ni.SumSpentPlan = obj.SumSpentPlan;
2973 // Расход План.
2974 ni.SumReturn = obj.SumReturn;
2975 ni.RetroFactSum = obj.RetroFactSum;
2976 ni.RetroFactCurrency = obj.RetroFactCurrency;
2977 ni.SumSpentDescription = obj.SumSpentDescription;
2978 ni.DocState = obj.DocState;
2979 ni.CostPrice = obj.CostPrice;
2980 ni.Manager = obj.Manager;
2981 if (obj.Manager != null)
2982 {
2983 ni.ManagerName = obj.Manager.FullName;
2984 }
2985 else
2986 {
2987 ni.ManagerName = obj.ManagerLogin;
2988 }
2989 ni.Customer = obj.CustomerName + "(ИНН:" + obj.CustomerINN + ")";
2990 ni.OfferType = obj.OfferType;
2991 ni.IsTender = obj.IsTender;
2992 ni.IsPostPayment = obj.IsPostPayment;
2993 //доп.отметки к номеру сделки
2994 ni.AdditionalToCRM = "";
2995 if (obj.IsTender == true)
2996 {
2997 ni.AdditionalToCRM += "Тендер!";
2998 }
2999 if (obj.IsPostPayment == true)
3000 {
3001 ni.AdditionalToCRM += "Постоплата!";
3002 }
3003 //UpdateStampHTMLSmall(context, item);
3004 ni.StampHTML = new MvcHtmlString(UpdateStampHTMLSmall(obj, ni.SumCash, ni.SumPayment));
3005 context.CostItems.Add(ni);
3006 CalcSumItogo(context);
3007 }
3008 UpdateHTMLinBLock(context);
3009 }
3010 }
3011 }
3012
3013 /// <summary>
3014 /// BeforeFillResponsibleTaskShow
3015 /// </summary>
3016 /// <param name="context">Контекст процесса</param>
3017 /// <param name="form"></param>
3018 public virtual void BeforeFillResponsibleTaskShow(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3019 {
3020 if (context.Chief != null)
3021 {
3022 form.For(c => c.Chief).Visible(false).Required(false);
3023 }
3024 if (context.FilialCurators.Count > 0 || context.Filial.Name == "Москва")
3025 {
3026 form.For(c => c.FilialCurators).Visible(false).Required(false);
3027 }
3028 // Нужно ли заполнять менеджеров или согласующих от исполнительного блока
3029 form.For(c => c.ManagersForApprovement).Visible(false).Required(false);
3030 form.For(c => c.ExecutorsForApprovement).Visible(false).Required(false);
3031 form.For(c => c.ChargeTypeApprovementUsers).Visible(false).Required(false);
3032 // определяем список сотрудников, которым не требуется предв. согласование с менеджерами
3033 var uu_nonman = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 607");
3034 List<User> nonmans = new List<User>();
3035 foreach (var uun in uu_nonman)
3036 {
3037 nonmans.AddRange(uun.ResponsibleUsers.ToList());
3038 }
3039 if (nonmans.Contains(context.Initiator) == true && (context.ChargeGroup2.NameFull.ToLowerInvariant().Contains("субподряд")/*|| context.ChargeGroup2.NameFull.ToLowerInvariant ().Contains ("оборудовани")*/))
3040 {
3041 Console.WriteLine("не нужно согласовывать ни с менеджерами ни с исп. блоком");
3042 }
3043 else
3044 {
3045 if (context.ChargeType.Value == "На договор")
3046 {
3047 if (context.InitiatorIsManager == false)// если инициатор не является менеджером
3048 {
3049 // Менеджеры
3050 if (context.ManagersForApprovement.Count == 0)
3051 {
3052 form.For(c => c.ManagersForApprovement).Visible(true).Required(false);
3053 }
3054 }
3055 else// если инициатор является менеджером
3056 {
3057 // Согласующие от исполнительного блока
3058 if (context.ExecutorsForApprovement.Count == 0 && !(context.ChargeGroup2.Name == "Бензин" && context.SumItogoPayment < 2000 && context.SumItogoCash < 2000))
3059 {
3060 form.For(c => c.ExecutorsForApprovement).Visible(true).Required(true);
3061 }
3062 }
3063 }
3064 else// Если за счет компании
3065 {
3066 // Согласующие по статье расхода
3067 // 27/10/2018 - если согласующий по статье расхода не указан в справочнике - значит согласование не нужно
3068 // if (context.ChargeTypeApprovementUsers.Count == 0) {
3069 // form.For (c => c.ChargeTypeApprovementUsers).Visible (true).Required (false);
3070 // }
3071 }
3072 }
3073 // Бухгалтерия
3074 if (context.ResponsiblesBookkeepers.Count > 0)
3075 {
3076 form.For(c => c.ResponsiblesBookkeepers).Visible(false).Required(false);
3077 }
3078 // Фин отдел
3079 // 27/10/2018 - согласование с финотделом не требуется
3080 form.For(c => c.ResponsiblesFinanceDepartment).Visible(false).Required(false);
3081 // if (context.ResponsiblesFinanceDepartment.Count == 0) {
3082 // form.For (c => c.ResponsiblesFinanceDepartment).Visible (true).Required (false);
3083 // }
3084 // Гл.Бух
3085 // 27/10/2018 - согласование с гл.бухом не требуется
3086 form.For(c => c.ResponsiblesBookkeeperChiefs).Visible(false).Required(false);
3087 // if (context.ResponsiblesBookkeeperChiefs.Count == 0) {
3088 // form.For (c => c.ResponsiblesBookkeeperChiefs).Visible (true).Required (false);
3089 // }
3090 // Директор
3091 form.For(c => c.ResponsiblesGeneralDirector).Visible(false).Required(false);
3092 // if (context.ResponsiblesGeneralDirector.Count == 0) {
3093 // form.For (c => c.ResponsiblesGeneralDirector).Visible (true).Required (false);
3094 // }
3095 // Бухгалтер по оплате счетов и кассир
3096 form.For(c => c.Bookkeepers).Visible(false).Required(false);
3097 form.For(c => c.Cashiers).Visible(false).Required(false);
3098 switch (context.PaymentWay.Value)
3099 {
3100 case "Наличный расчет":
3101 // Кассир
3102 if (context.Cashiers.Count == 0)
3103 {
3104 form.For(c => c.Cashiers).Visible(true).Required(true);
3105 }
3106 break;
3107 case "Безналичный расчет":
3108 // Бухгалтер по оплате счетов
3109 if (context.Bookkeepers.Count == 0)
3110 {
3111 form.For(c => c.Bookkeepers).Visible(true).Required(true);
3112 }
3113 break;
3114 case "Наличный+безналичный":
3115 // Бухгалтер по оплате счетов
3116 if (context.Bookkeepers.Count == 0)
3117 {
3118 form.For(c => c.Bookkeepers).Visible(true).Required(true);
3119 }
3120 // Кассир
3121 if (context.Cashiers.Count == 0)
3122 {
3123 form.For(c => c.Cashiers).Visible(true).Required(true);
3124 }
3125 break;
3126 }
3127 }
3128
3129 /// <summary>
3130 /// ChargeGroup1AfterChange
3131 /// </summary>
3132 /// <param name="context">Контекст процесса</param>
3133 /// <param name="form"></param>
3134 public virtual void ChargeGroup1AfterChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3135 {
3136 context.RentContract = null;
3137 //Если выбрана группа расходов и выбран тип расходов, то ставим фильтр
3138 if (context.ChargeGroup != null && context.ChargeType != null)
3139 {
3140 // Делаю видимым поле Группа расходов
3141 form.For(c => c.ChargeGroup2).Visible(true).Required(true);
3142 // Органичиваю выбор значений в поле фильтром
3143 string ftype = "True";
3144 if (context.ChargeType.Value == "За счет компании")
3145 {
3146 ftype = "ByOurCompany";
3147 // form.For (c => c.NumbersInCRM).Visible (false).Required (false);
3148 }
3149 else
3150 if (context.ChargeType.Value == "На договор")
3151 {
3152 ftype = "ByContract";
3153 // form.For (c => c.NumbersInCRM).Visible (true).Required (true);
3154 }
3155 //var filter = PublicAPI.Objects.UserObjects.UserChargesGroups.Filter().Query ("SearchName like '%"+context.ChargeGroup.Name+"%' and "+ftype+"=true").Filter;
3156 //context.ChargeGroup2 = EntityManager<ChargeTypes>.Instance.Find (filter2, null).FirstOrDefault ();
3157 context.ChargeGroup2 = null;
3158 var settings = (EntitySettings)context.GetSettingsFor(c => c.ChargeGroup2);
3159 settings.FilterQuery = "ChargeGroup=" + context.ChargeGroup.Id + " and " + ftype + "=true";
3160 if (context.Initiator.UserName != "HazipovIR" && context.ChargeGroup.Name == "Содержание офиса")
3161 {
3162 settings.FilterQuery += " and Name <> 'Благоустройство'";
3163 }
3164 if (context.ChargeGroup.Name == "Расходы руководства" && context.Initiator.UserName != "VorobyovaK" && context.Initiator.UserName != "PododnyayaA" && context.Initiator.UserName != "LunguYA" && context.Initiator.UserName != "KazakovaKV")
3165 {
3166 settings.FilterQuery += " and Name <> 'Расходы руководства'";
3167 }
3168 settings.Save();
3169 // form.For (c => c.PaymentWay).Visible (false).Required (false);
3170 }
3171 else
3172 {
3173 // form.For (c => c.ChargeGroup2).Visible (false).Required (false);
3174 // form.For (c => c.NumbersInCRM).Visible (false).Required (false);
3175 // form.For (c => c.PaymentWay).Visible (false).Required (false);
3176 }
3177 BeforeTask1Show(context, form);
3178 }
3179
3180 /// <summary>
3181 /// ChargeGroup2AfterChange
3182 /// </summary>
3183 /// <param name="context">Контекст процесса</param>
3184 /// <param name="form"></param>
3185 public virtual void ChargeGroup2AfterChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3186 {
3187 context.RentContract = null;
3188 //показываем комментарий из справочника
3189 try
3190 {
3191 if (!String.IsNullOrWhiteSpace(context.ChargeGroup2.Description))
3192 {
3193 context.CommentFromChargeType2 = context.ChargeGroup2.Description;
3194 }
3195 }
3196 catch (Exception e)
3197 {
3198 }
3199 //Если выбрана группа расходов и выбран тип расходов, то ставим фильтр
3200 if (context.ChargeGroup2 != null)
3201 {
3202 // Делаю видимым поле Группа расходов
3203 // form.For (c => c.PaymentWay).Visible (true).Required (true);
3204 // Заполняем выбор значениями, доступными согласно справочника
3205 var settingsValue = (DropDownListSettings)context.GetSettingsFor(c => c.PaymentWay);
3206 settingsValue.Items.Clear();
3207 //Наличный расчет
3208 //Безналичный расчет
3209 //Наличный+безналичный
3210 if (context.ChargeGroup2.ByCash == true)
3211 {
3212 settingsValue.Items.Add(new DropDownItem("Наличный расчет"));
3213 }
3214 //if(context.Initiator.Id == 1130 || context.Initiator.Id == 1530 || (context.ChargeGroup != null && context.ChargeGroup.Name == "Обеспечение тендерных заявок и договоров"))
3215 //{
3216 if (context.ChargeGroup2.ByPayment == true)
3217 {
3218 settingsValue.Items.Add(new DropDownItem("Безналичный расчет"));
3219 }
3220 else
3221 {
3222 // Исключение по заявке от Моториной В. 04.07.2019
3223 // для Пономаревой если билеты разрешить безнал
3224 if (context.ChargeGroup2.Name == "Билеты" && context.Initiator.UserName == "travel" || context.Initiator.UserName == "PonomarevaMM" || context.Initiator.UserName == "GladkihED")
3225 {
3226 settingsValue.Items.Add(new DropDownItem("Безналичный расчет"));
3227 }
3228 }
3229 if (context.ChargeGroup2.CashNPayment == true)
3230 {
3231 settingsValue.Items.Add(new DropDownItem("Наличный+безналичный"));
3232 }
3233 //}
3234 settingsValue.Save();
3235 // Если Расход на протокол, то скрываем поле Номера сделок CRM, показываем Приложения
3236 // if (context.ChargeGroup2.Name == "Расходы на протокол") {
3237 // form.For (c => c.Attachments).Visible (true).Required (true);
3238 // form.For (c => c.NumbersInCRM).Visible (false).Required (false);
3239 // }
3240 }
3241 BeforeTask1Show(context, form);
3242 }
3243
3244 /// <summary>
3245 /// BlockBeforeShow
3246 /// </summary>
3247 /// <param name="context">Контекст процесса</param>
3248 /// <param name="item"></param>
3249 /// <param name="form"></param>
3250 public virtual void BlockBeforeShow(Context context, P_ClCash4Contractor_CostItems item, EleWise.ELMA.Model.Views.FormViewBuilder<P_ClCash4Contractor_CostItems> form)
3251 {
3252 if (context.ChargeType.Value == "За счет компании")
3253 {
3254 form.For(c => c.NumAppCRM).Visible(false);
3255 }
3256 else
3257 if (context.ChargeType.Value == "На договор")
3258 {
3259 form.For(c => c.NumAppCRM).Visible(true).ReadOnly(true);
3260 }
3261 switch (context.PaymentWay.Value)
3262 {
3263 case "Наличный расчет":
3264 form.For(c => c.SumCash).Visible(true).Required(true);
3265 form.For(c => c.ContractorName).Visible(true).Required(true);
3266 form.For(c => c.SumPayment).Visible(false);
3267 break;
3268 case "Безналичный расчет":
3269 form.For(c => c.SumCash).Visible(false);
3270 form.For(c => c.SumPayment).Visible(true).Required(true);
3271 form.For(c => c.ContractorName).Visible(true).ReadOnly(true);
3272 break;
3273 case "Наличный+безналичный":
3274 form.For(c => c.SumCash).Visible(true).Required(false);
3275 form.For(c => c.SumPayment).Visible(true).Required(false);
3276 form.For(c => c.ContractorName).Visible(true).ReadOnly(true);
3277 break;
3278 }
3279 form.For(c => c.HTML).Visible(false);
3280 //UpdateHTMLinBLock(context);
3281 // form.For (c => c.HTML).Visible (true).Required (false);
3282 // form.For (c => c.SumCash).Visible (false).Required (false);
3283 // form.For (c => c.SumPayment).Visible (false).Required (false);
3284 // form.For (c => c.ContractorName).Visible (false).Required (false);
3285 // form.For (c => c.NumAppCRM).Visible (false).Required (false);
3286 }
3287
3288 /// <summary>
3289 /// Block_SumCash_AfterChange
3290 /// </summary>
3291 /// <param name="context">Контекст процесса</param>
3292 /// <param name="item"></param>
3293 /// <param name="form"></param>
3294 public virtual void Block_SumCash_AfterChange(Context context, P_ClCash4Contractor_CostItems item, EleWise.ELMA.Model.Views.FormViewBuilder<P_ClCash4Contractor_CostItems> form)
3295 {
3296 CalcSumItogo(context);
3297 UpdateHTMLinBLock(context);
3298 }
3299
3300 /// <summary>
3301 /// Block_SumPayment_AfterChange
3302 /// </summary>
3303 /// <param name="context">Контекст процесса</param>
3304 /// <param name="item"></param>
3305 /// <param name="form"></param>
3306 public virtual void Block_SumPayment_AfterChange(Context context, P_ClCash4Contractor_CostItems item, EleWise.ELMA.Model.Views.FormViewBuilder<P_ClCash4Contractor_CostItems> form)
3307 {
3308 CalcSumItogo(context);
3309 UpdateHTMLinBLock(context);
3310 }
3311
3312 /// <summary>
3313 /// CheckValuesTask3
3314 /// </summary>
3315 /// <param name="context">Контекст процесса</param>
3316 /// <param name="form"></param>
3317 public virtual bool CheckValuesTask3(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3318 {
3319 // Проверка формата вложенных файлов
3320 foreach (var att in context.Attachments)
3321 {
3322 string ext = System.IO.Path.GetExtension(att.File.ContentFilePath.ToLower());
3323 List<string> ext_list = new List<string>() {
3324 ".doc",
3325 ".docx",
3326 ".xls",
3327 ".xlsx",
3328 ".pdf",
3329 ".rtf",
3330 ".jpg",
3331 ".jpeg",
3332 ".png"
3333 };
3334 if (!ext_list.Contains(ext))
3335 {
3336 form.Notifier.Error("Вложен файл недопустимого формата! Файл должен быть одного из форматов: pdf, doc, docx, rtf, xls, xlsx, jpg, jpeg, png.");
3337 form.For(c => c.ErrorText).Visible(true).ReadOnly(true);
3338 context.ErrorText = "Вложен файл недопустимого формата! Файл должен быть одного из форматов: pdf, doc, docx, rtf, xls, xlsx, jpg, jpeg, png.";
3339 return false;
3340 }
3341 }
3342 if (context.SumItogoCash == 0 && context.SumItogoPayment == 0)
3343 {
3344 form.Notifier.Error("Не указана сумма оплаты!");
3345 return false;
3346 }
3347 // Если Расход на протокол, то скрываем поле Номера сделок CRM, показываем Приложения
3348 if (context.ChargeGroup2.Name == "Расходы на протокол")
3349 {
3350 if (context.Attachments.Count == 0)
3351 {
3352 form.Notifier.Error("Не вложен протокол, который необходим если выбран тип расхода 'на протокол'!");
3353 }
3354 }
3355 else
3356 {
3357 // првоерка распределения сумм по сделкам
3358 // if (context.ChargeType.Value == "На договор" && (context.SumCash != context.SumItogoCash || context.SumPayment != context.SumItogoPayment)) {
3359 // form.Notifier.Error ("Имеется нераспределенная сумма!");
3360 // return false;
3361 // }
3362 if (context.ChargeType.Value == "На договор" && Math.Round(context.SumCash, 2) != context.SumItogoCash)
3363 {
3364 form.Notifier.Error("Распределенная сумма нал не совпадает с общей суммой, указанной в заявке! ");
3365 return false;
3366 }
3367 if (context.ChargeType.Value == "На договор" && Math.Round(context.SumPayment, 2) != context.SumItogoPayment)
3368 {
3369 form.Notifier.Error("Распределенная сумма безнал не совпадает с общей суммой, указанной в заявке! " + context.SumPayment.ToString() + " != " + context.SumItogoPayment.ToString());
3370 return false;
3371 }
3372 }
3373 /*if (context.ChargeType.Value == "За счет компании" && context.PaymentWay.Value == "Наличный расчет" && context.SumCash != context.SumItogoCash) {
3374 form.For (c => c.ErrorText).Visible (true).ReadOnly (true);
3375 context.ErrorText = "Распределенная сумма не совпадает с общей суммой, указанной в заявке!";
3376 return false;
3377 }*/
3378 form.For(c => c.ErrorText).Visible(false).ReadOnly(true);
3379 return true;
3380 }
3381
3382 /// <summary>
3383 /// CreatePaymentDocIn1C
3384 /// </summary>
3385 /// <param name="context">Контекст процесса</param>
3386 /// <param name="form"></param>
3387 public virtual void CreatePaymentDocIn1C(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3388 {
3389 // Иниицирую создание ПП в 1С
3390 // var t = Integration1С.Integration1С.FindCounterparty1C(context.INNOurCompany, context.ContractorINN, context.ContractorBankBIK, context.ContractorAccount);
3391 // //Console.WriteLine(t.);
3392 // t.Sum = context.SumItogoPayment;
3393 // t.NDS = false;
3394 // t.NameContractor = context.ContractorName;
3395 //
3396 // // Обратно получаю ссылку на документ + pdf документа
3397 // var pp = Integration1С.Integration1С.CreatePaymentOrder(t);
3398 // Console.WriteLine(pp.file);
3399 // Console.WriteLine(pp.link);
3400 // Console.WriteLine(pp.number);
3401 }
3402
3403 /// <summary>
3404 /// ApprovementTask_BeforeShow
3405 /// </summary>
3406 /// <param name="context">Контекст процесса</param>
3407 /// <param name="form"></param>
3408 public virtual void ApprovementTask_BeforeShow(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3409 {
3410 UpdateHTMLinBLock(context);
3411 }
3412
3413 /// <summary>
3414 /// CreateRouteApprovement
3415 /// Маршрут согласования Этап 1
3416 /// </summary>
3417 /// <param name="context">Контекст процесса</param>
3418 public virtual void CreateRouteApprovement(Context context)
3419 {
3420 // Формируем маршрут согласования этапа 1
3421 var StageGuid = new Guid();
3422 var ra = EntityManager<RouteApprovement>.Instance.Create();
3423 ra.Name = "Согласование " + context.DocumentExternalPayment.Name;
3424 int number = 0;
3425 if (context.AdditionalApprovementUsersFInitiator.Count > 0)
3426 {
3427 var ras = EntityManager<StageApprovement>.Instance.Create();
3428 number += 1;
3429 ras.Number = number;
3430 ras.InitialStageGuid = StageGuid;
3431 StageGuid = ras.Uid;
3432 ras.ExecutionType = ApprovementExecutionType.Parallel;
3433 //ras.UseFirstExecutor = true;
3434 ras.UseFirstExecutor = false;
3435 ras.Name = "Дополнительные согласующие от инициатора";
3436 //ras.Number = context.RouteApprovement.StageApprovementList.Last().Number + 1;
3437 ras.Users.AddAll(context.AdditionalApprovementUsersFInitiator);
3438 ras.TimeInterval = TimeSpan.FromDays(1);
3439 ras.Save();
3440 ra.StageApprovementList.Add(ras);
3441 }
3442 foreach (var step in context.WayApprovement)
3443 {
3444 if (step.Stage == 1 && step.ApprovementUsers.Count > 0)
3445 {
3446 var ras = EntityManager<StageApprovement>.Instance.Create();
3447 number += 1;
3448 ras.Number = number;
3449 ras.InitialStageGuid = StageGuid;
3450 StageGuid = ras.Uid;
3451 ras.ExecutionType = ApprovementExecutionType.Parallel;
3452 //ras.UseFirstExecutor = true;
3453 ras.UseFirstExecutor = false;
3454 ras.Name = step.Comment;
3455 //ras.Number = context.RouteApprovement.StageApprovementList.Last().Number + 1;
3456 ras.Users.AddAll(step.ApprovementUsers);
3457 ras.TimeInterval = TimeSpan.FromDays(1);
3458 ras.Save();
3459 ra.StageApprovementList.Add(ras);
3460 }
3461 }
3462 ra.Save();
3463 context.RouteApprovement = ra;
3464 foreach (var cFil in context.FilialCurators)
3465 {
3466 PublicAPI.Docflow.Document.AddViewPermission(context.DocumentExternalPayment, cFil);
3467 }
3468 if (!context.Filial.Name.Contains("Москва") && context.Filial.ParentItem != null && context.Filial.ParentItem.Id == 15597)// Региональная группа РФ и филлиал не Московский
3469 {
3470 PublicAPI.Docflow.Document.AddViewPermission(context.DocumentExternalPayment, PublicAPI.Portal.Security.User.Load(1564));
3471 //Пацук Екатерина Викторовна
3472 PublicAPI.Docflow.Document.AddViewPermission(context.DocumentExternalPayment, PublicAPI.Portal.Security.User.Load(1584));
3473 //Пипкина Ксения Андреевна
3474 //PublicAPI.Docflow.Document.AddEditPermission(context.DocumentExternalPayment,context.Initiator);
3475 //PublicAPI.Docflow.Document.AddFullAccessPermission(context.DocumentExternalPayment,PublicAPI.Portal.Security.UserGroup.Load(1));
3476 }
3477 if (context.SumItogoCash > 0)
3478 {
3479 //Выдача прав группе кассиров
3480 PublicAPI.Docflow.Document.AddViewPermission(context.DocumentExternalPayment, PublicAPI.Portal.Security.UserGroup.Load(6567));
3481 }
3482 if (context.SumItogoPayment > 0)
3483 {
3484 //выдача прав группе бухгалтерии
3485 PublicAPI.Docflow.Document.AddViewPermission(context.DocumentExternalPayment, PublicAPI.Portal.Security.UserGroup.Load(6566));
3486 }
3487 // выдача прав группе АХО на определенных контрагентов
3488 List<string> contINN = new List<string> {
3489 "7722291425",
3490 "9715204369",
3491 "5047036146",
3492 "7826156685",
3493 "2310068482",
3494 "7706202481",
3495 "7839005130",
3496 "5261038946",
3497 "6163069899",
3498 "5405274400",
3499 "6164036247",
3500 "7721793895",
3501 "6659101805",
3502 "7451101090"
3503 };
3504 if (context.ContractorINN != null && contINN.Contains(context.ContractorINN.Trim()))
3505 {
3506 //выдача прав группе АХО
3507 PublicAPI.Docflow.Document.AddViewPermission(context.DocumentExternalPayment, PublicAPI.Portal.Security.UserGroup.Load(9297));
3508 }
3509 //...........................................
3510 //поиск Воробьевой для перестановки
3511 for (int i = 0; i < context.RouteApprovement.StageApprovementList.Count; i++)
3512 {
3513 for (int j = 0; j < context.RouteApprovement.StageApprovementList.ElementAt(i).Users.Count; j++)
3514 {
3515 User tekyshii_user = context.RouteApprovement.StageApprovementList.ElementAt(i).Users.ElementAt(j);
3516 if (tekyshii_user.Id == 1029)//если Воробьева, то переставляем в конец согласующих
3517 //if(tekyshii_user.Id == 85852)//если Тепляков, то переставляем в конец согласующих
3518 {
3519 //Console.WriteLine("Here");
3520 User clone_tekyshii_user = null;
3521 tekyshii_user.CopyFrom(clone_tekyshii_user);
3522 //Console.WriteLine("Position before = " + context.RouteApprovement.StageApprovementList.ElementAt(i).Users.ToList().IndexOf(tekyshii_user).ToString());
3523 context.RouteApprovement.StageApprovementList.ElementAt(i).Users.Remove(tekyshii_user);
3524 //удаляем с текущей позиции
3525 context.RouteApprovement.StageApprovementList.ElementAt(i).Users.Add(clone_tekyshii_user);
3526 //вставляем в конец
3527 /*int index_to_insert = context.RouteApprovement.StageApprovementList.ElementAt(i).Users.Count - 1;
3528
3529 context.RouteApprovement.StageApprovementList.ElementAt(i).Users.ToList().Insert(index_to_insert, clone_tekyshii_user);//вставляем в конец*///Console.WriteLine("Position after = " + context.RouteApprovement.StageApprovementList.ElementAt(i).Users.ToList().IndexOf(clone_tekyshii_user).ToString());
3530 }
3531 }
3532 }
3533 //...........................................
3534 }
3535
3536 /// <summary>
3537 /// CreateRouteApprovement_Stage2
3538 /// Маршрут согласования этап 2
3539 /// </summary>
3540 /// <param name="context">Контекст процесса</param>
3541 public virtual void CreateRouteApprovement_Stage2(Context context)
3542 {
3543 Guid StageGuid = new Guid();
3544 if (context.RouteApprovement.StageApprovementList.Count > 0)
3545 {
3546 //ras.InitialStageGuid = context.RouteApprovement.StageApprovementList.Last ().Uid;
3547 StageGuid = context.RouteApprovement.StageApprovementList.Last().Uid;
3548 }
3549 int number = 0;
3550 if (context.RouteApprovement != null || context.RouteApprovement.StageApprovementList.Count > 0)
3551 {
3552 number = context.RouteApprovement.StageApprovementList.Count;
3553 }
3554 foreach (var step in context.WayApprovement)
3555 {
3556 if (step.Stage == 3 && step.ApprovementUsers.Count > 0)
3557 {
3558 var ras = EntityManager<StageApprovement>.Instance.Create();
3559 number += 1;
3560 ras.Number = number;
3561 ras.InitialStageGuid = StageGuid;
3562 StageGuid = ras.Uid;
3563 ras.ExecutionType = ApprovementExecutionType.Parallel;
3564 ras.UseFirstExecutor = false;
3565 ras.Name = step.Comment;
3566 //ras.Number = context.RouteApprovement.StageApprovementList.Last().Number + 1;
3567 ras.Users.AddAll(step.ApprovementUsers);
3568 ras.TimeInterval = TimeSpan.FromDays(1);
3569 ras.Save();
3570 context.RouteApprovement.StageApprovementList.Add(ras);
3571 }
3572 }
3573 context.RouteApprovement.Save();
3574 }
3575
3576 /// <summary>
3577 /// FindOurCompanyINN
3578 /// </summary>
3579 /// <param name="context">Контекст процесса</param>
3580 /// <param name="form"></param>
3581 public virtual void FindOurCompanyINN(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3582 {
3583 if (context.OurCompany != null)
3584 {
3585 context.INNOurCompany = context.OurCompany.INN;
3586 }
3587 }
3588
3589 /// <summary>
3590 /// CheckIfApprovementIsNeeded
3591 /// </summary>
3592 /// <param name="context">Контекст процесса</param>
3593 public virtual object CheckIfApprovementIsNeeded(Context context)
3594 {
3595 bool needed = false;
3596 foreach (var stage in context.RouteApprovement.StageApprovementList)
3597 {
3598 if (stage.StagePassed == false && stage.Users.Count > 0)
3599 {
3600 needed = true;
3601 }
3602 }
3603 return needed;
3604 }
3605
3606 /// <summary>
3607 /// BeforeShowTask4
3608 /// </summary>
3609 /// <param name="context">Контекст процесса</param>
3610 /// <param name="form"></param>
3611 public virtual void BeforeShowTask4(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3612 {
3613 var settings = (EntitySettings)context.GetSettingsFor(c => c.OurCompany);
3614 settings.FilterQuery = "NonActive = FALSE";
3615 settings.Save();
3616 UpdateApprovementsStampHTML(context);
3617 // Обновляю суммы
3618 context.NewSumCash = context.SumItogoCash;
3619 context.NewSumPayment = context.SumItogoPayment;
3620 }
3621
3622 /// <summary>
3623 /// ExtractAccountData
3624 /// </summary>
3625 /// <param name="context">Контекст процесса</param>
3626 public virtual void ExtractAccountData(Context context)
3627 {
3628 if (context.IncomingAccount != null && context.IncomingAccount.CurrentVersion != null)
3629 {
3630 context.FileAccount = InterfaceActivator.Create<BinaryFile>();
3631 context.FileAccount.Name = context.IncomingAccount.CurrentVersion.File.Name;
3632 context.FileAccount.CreateDate = context.IncomingAccount.CurrentVersion.File.CreateDate;
3633 context.FileAccount.InitializeContentFilePath();
3634 System.IO.File.Copy(context.IncomingAccount.CurrentVersion.File.ContentFilePath, context.FileAccount.ContentFilePath);
3635 PublicAPI.Services.File.SaveFile(context.FileAccount);
3636 //Locator.GetServiceNotNull<IFileManager> ().SaveFile(context.FileAccount);
3637 }
3638 context.EmailTitle = context.IncomingAccount.Name;
3639 context.IncomingAccount.Name = DocumentManager.Instance.GenerateName(context.IncomingAccount, null, true) + " (из эл.почты)";
3640 context.IncomingAccount.Save();
3641 // ConvertAccountFileToPDF0 (context);
3642 // if (System.IO.File.Exists (context.FileAccountPDF.ContentFilePath)) {
3643 // Console.WriteLine ("Заменяем файл Счет");
3644 // context.FileAccount = context.FileAccountPDF;
3645 // // System.IO.File.Copy (context.FileAccountPDF.ContentFilePath, context.FileAccount.ContentFilePath, true);
3646 // PublicAPI.Services.File.SaveFile (context.FileAccount);
3647 // }
3648 }
3649
3650 /// <summary>
3651 /// AfterResponsibleTask_CheckRulesForApprovementUsers
3652 /// </summary>
3653 /// <param name="context">Контекст процесса</param>
3654 /// <param name="form"></param>
3655 public virtual bool AfterResponsibleTask_CheckRulesForApprovementUsers(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3656 {
3657 // Если инициатор = менеджер, то проверяем, являются ли пользователи, указанные в context.ExecutorsForApprovement сотрудниками Исполнительного блока - ищем среди вышестоящих подразделений "Исполнительный блок"
3658 if (context.InitiatorIsManager == true)
3659 {
3660 // 1) ищем все вышестоящие подразделения у каждого указанного пользователя (у его должности)
3661 bool AllApproversAreExecutors = true;
3662 // признак "все ли указанные являются ли исполнителями"
3663 foreach (var approver in context.ExecutorsForApprovement.ToList())
3664 {
3665 //bool isispblock = false;
3666 // Если Григорьев, то не проверяем
3667 if (approver.UserName == "PododnyayaA" || approver.UserName == "BozkurtI" || approver.UserName == "GrigorievAA" || approver.UserName == "FilatchevAP" || approver.UserName == "FilatchevPP" || approver.UserName == "ElnikovaEM" || approver.UserName == "VorobyovaK" || approver.UserName == "KrylovaUA" || approver.UserName == "ershov")
3668 {
3669 }
3670 else
3671 {
3672 Console.WriteLine("исполнитель - " + approver.FullName);
3673 List<string> parent_unit_names = new List<string>();
3674 //OrganizationItem unit = approver.OrganizationItems.FirstOrDefault();
3675 OrganizationItem unit = approver.OrganizationItems.ToArray().Union(approver.OrganizationGroups).FirstOrDefault();
3676 Console.WriteLine("первый отдел - " + unit.Name);
3677 while (unit.ParentItem != null)
3678 {
3679 Console.WriteLine(unit.Name);
3680 parent_unit_names.Add(unit.Name);
3681 unit = unit.ParentItem;
3682 }
3683 //if (isispblock == false)
3684 if (!parent_unit_names.Contains("Исполнительный блок") && !parent_unit_names.Contains("Лаборатория"))
3685 {
3686 AllApproversAreExecutors = false;
3687 form.Notifier.Error("Ошибка: " + approver.FullName + ", указанный в поле \"Согласующий от отдела исполнителя\" не является сотрудником исполнительного блока.");
3688 return false;
3689 }
3690 }
3691 }
3692 }
3693 Console.WriteLine("все ок");
3694 return true;
3695 }
3696
3697 /// <summary>
3698 /// CheckIfCommentWritten
3699 /// </summary>
3700 /// <param name="context">Контекст процесса</param>
3701 /// <param name="form"></param>
3702 public virtual bool CheckIfCommentWritten(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3703 {
3704 if (context.CorrectorComments.Length == 0 || context.CorrectorComments == null)
3705 {
3706 form.Notifier.Error("При возврате на корректировку обязательно указать комментарий с причиной возврата, чтобы инициатору было понятно, что нужно исправить");
3707 return false;
3708 }
3709 return true;
3710 }
3711
3712 /// <summary>
3713 /// CheckIfBookkeeperCorrectionIsNeeded
3714 /// </summary>
3715 /// <param name="context">Контекст процесса</param>
3716 public virtual object CheckIfBookkeeperCorrectionIsNeeded(Context context)
3717 {
3718 if (context.ChargeGroup2 != null && context.ChargeGroup2.AskCheckBookkeeper == true)
3719 {
3720 return true;
3721 }
3722 else
3723 {
3724 return false;
3725 }
3726 }
3727
3728 /// <summary>
3729 /// BeforeFormShow_PaymentBeznal
3730 /// </summary>
3731 /// <param name="context">Контекст процесса</param>
3732 /// <param name="form"></param>
3733 public virtual void BeforeFormShow_PaymentBeznal(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3734 {
3735 if (context.OurCompany != null && !String.IsNullOrWhiteSpace(context.OurCompany.INN)/*&& (context.INNOurCompany == null || context.INNOurCompany == "")*/)
3736 {
3737 context.INNOurCompany = context.OurCompany.INN;
3738 }
3739 if (context.AccountPurpose == null)
3740 {
3741 context.AccountPurpose = "";
3742 //"{" + context.DocumentExternalPayment.Id.ToString () + "}";
3743 context.AccountPurpose += " Оплата счета №" + context.AccountNumber;
3744 if (context.AccountDate != null)
3745 {
3746 context.AccountPurpose += " от " + context.AccountDate.Value.ToShortDateString();
3747 }
3748 }
3749 context.DatePaymentDoc = DateTime.Today;
3750 UpdateApprovementsStampHTML(context);
3751 //Проверка, включена ли интеграция с 1С по данной нашей компании
3752 CheckIfOurCompanyIntegration1COn(context);
3753 }
3754
3755 /// <summary>
3756 /// ConvertAccountFileToPDF
3757 /// </summary>
3758 /// <param name="context">Контекст процесса</param>
3759 /// <param name="form"></param>
3760 // public virtual void ConvertAccountFileToPDF (Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3761 // {
3762 // ConvertAccountFileToPDF0 (context);
3763 // // if (context.FileAccount != null) {
3764 // // Console.WriteLine ("тип вложения: " + context.FileAccount.ContentType);
3765 // // var tmpaccfile = InterfaceActivator.Create<BinaryFile> ();
3766 // // tmpaccfile.Name = "tmp.pdf";
3767 // // tmpaccfile.InitializeContentFilePath ();
3768 // // /// Форматы:
3769 // // /// application/pdf,
3770 // // /// image/jpeg,
3771 // // /// application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
3772 // // /// application/vnd.ms-excel
3773 // // /// application/vnd.openxmlformats-officedocument.wordprocessingml.document - docx
3774 // // // Если счет - не pdf, а изображение - конвертируем в pdf
3775 // // if (context.FileAccount.ContentType.Contains ("image")) {
3776 // // Console.WriteLine ("case = image");
3777 // // context.SysLog += "\n формат счета = Image. |"+ context.FileAccount.ContentType;
3778 // // // Если не pdf, то сначала конвертируем в pdf
3779 // // var imagepdf = new Aspose.Pdf.Document ();
3780 // // // add page to pages collection of document instance
3781 // // imagepdf.Pages.Add ();
3782 // // Aspose.Pdf.Image image = new Aspose.Pdf.Image ();
3783 // // FileStream imageStream = new FileStream (context.FileAccount.ContentFilePath, FileMode.Open);
3784 // // // create Bitmap image so we can get image information
3785 // // image.ImageStream = imageStream;
3786 // // // add image to pagaraphs collection of first page
3787 // // imagepdf.Pages [1].Paragraphs.Add (image);
3788 // // imagepdf.Pages [1].PageInfo.Margin.Left = 1;
3789 // // imagepdf.Pages [1].PageInfo.Margin.Top = 1;
3790 // // imagepdf.Pages [1].PageInfo.Margin.Bottom = 1;
3791 // // imagepdf.Pages [1].PageInfo.Margin.Right = 1;
3792 // // imagepdf.Save (tmpaccfile.ContentFilePath, Aspose.Pdf.SaveFormat.Pdf);
3793 // // Console.WriteLine ("Счет-картинка сохранен в pdf: " + tmpaccfile.ContentFilePath);
3794 // // //account_pdf = new Aspose.Pdf.Document(tmpaccfile.ContentFilePath);
3795 // // }
3796 // // // Если Excel
3797 // // else
3798 // // if (context.FileAccount.ContentType.Contains ("ms-excel") || context.FileAccount.ContentType.Contains ("officedocument.spreadsheetml.sheet")) {
3799 // // Console.WriteLine ("case = excel");
3800 // // context.SysLog += "\n формат счета = Excel. |"+ context.FileAccount.ContentType;
3801 // // var tmpfile = InterfaceActivator.Create<BinaryFile> ();
3802 // // tmpfile.Name = "tmp.pdf";
3803 // // tmpfile.InitializeContentFilePath ();
3804 // // Aspose.Cells.Workbook excelpdf = new Aspose.Cells.Workbook (context.FileAccount.ContentFilePath);
3805 // // excelpdf.Save (tmpaccfile.ContentFilePath, Aspose.Cells.SaveFormat.Pdf);
3806 // // //account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
3807 // // //Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
3808 // // if (System.IO.File.Exists (tmpfile.ContentFilePath))
3809 // // System.IO.File.Delete (tmpfile.ContentFilePath);
3810 // // }
3811 // // // Если MS Word
3812 // // else if (context.FileAccount.ContentType.Contains ("msword") || context.FileAccount.ContentType.Contains ("application/rtf") || context.FileAccount.ContentType.Contains ("/vnd.openxmlformats-officedocument.wordprocessingml.document")) {
3813 // // Console.WriteLine ("case = word");
3814 // // context.SysLog += "\n формат счета = Word. |"+ context.FileAccount.ContentType;
3815 // // var tmpfile = InterfaceActivator.Create<BinaryFile> ();
3816 // // tmpfile.Name = "tmp.pdf";
3817 // // tmpfile.InitializeContentFilePath ();
3818 // // //Aspose.Cells.Workbook excelpdf = new Aspose.Cells.Workbook (context.FileAccount.ContentFilePath);
3819 // // Aspose.Words.Document wordpdf = new Aspose.Words.Document (context.FileAccount.ContentFilePath);
3820 // // wordpdf.Save (tmpaccfile.ContentFilePath, Aspose.Words.SaveFormat.Pdf);
3821 // // //account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
3822 // // //Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
3823 // // if (System.IO.File.Exists (tmpfile.ContentFilePath))
3824 // // System.IO.File.Delete (tmpfile.ContentFilePath);
3825 // // }
3826 // // else
3827 // // {
3828 // //
3829 // // //******** PDF ********************
3830 // // Console.WriteLine ("case = other");
3831 // // context.SysLog += "\n формат счета = прочие |"+ context.FileAccount.ContentType;
3832 // // //Console.WriteLine("попытка создать pdf из файла "+context.FileAccount.ContentFilePath);
3833 // // CompressPDFPages (context.FileAccount.ContentFilePath);
3834 // //
3835 // // System.IO.File.Copy (context.FileAccount.ContentFilePath, tmpaccfile.ContentFilePath);
3836 // // //******** PDF ********************
3837 // // }
3838 // // // используя полученный файл счета в PDF объединяем его с документом служебки
3839 // // //Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document (tmpaccfile.ContentFilePath);
3840 // // context.FileAccountPDF = InterfaceActivator.Create<BinaryFile> ();
3841 // // context.FileAccountPDF.Name = "Счет.pdf";
3842 // // context.FileAccountPDF.CreateDate = DateTime.Now;
3843 // // context.FileAccountPDF.InitializeContentFilePath ();
3844 // // System.IO.File.Copy (tmpaccfile.ContentFilePath, context.FileAccountPDF.ContentFilePath);
3845 // // PublicAPI.Services.File.SaveFile (context.FileAccountPDF);
3846 // // }
3847 // }
3848 /// <summary>
3849 /// ConvertAccountFileToPDF
3850 /// </summary>
3851 /// <param name="context">Контекст процесса</param>
3852 /// <param name="form"></param>
3853 // public virtual void ConvertAccountFileToPDF0 (Context context)
3854 // {
3855 // if (context.FileAccount != null) {
3856 // Console.WriteLine ("тип вложения: " + context.FileAccount.ContentType);
3857 // var tmpaccfile = InterfaceActivator.Create<BinaryFile> ();
3858 // tmpaccfile.Name = "tmp.pdf";
3859 // tmpaccfile.InitializeContentFilePath ();
3860 // /// Форматы:
3861 // /// application/pdf,
3862 // /// image/jpeg,
3863 // /// application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
3864 // /// application/vnd.ms-excel
3865 // /// application/vnd.openxmlformats-officedocument.wordprocessingml.document - docx
3866 // ///
3867 // ///
3868 // /// Если файл из эл. почты, то вручную проверяем формат
3869 // Console.WriteLine ("case = pdf");
3870 // context.SysLog += "\n формат счета = pdf |" + context.FileAccount.ContentType;
3871 // string file_name = System.IO.Path.GetFileNameWithoutExtension (context.FileAccount.ContentFilePath);
3872 // string file_ext = System.IO.Path.GetExtension (context.FileAccount.ContentFilePath);
3873 // Console.WriteLine ("расширение = " + file_ext);
3874 // if (file_ext.ToLowerInvariant () == ".docx") {
3875 // Console.WriteLine ("00");
3876 // context.FileAccount.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
3877 // context.SysLog += "\n установили новый тип файла - " + context.FileAccount.ContentType;
3878 // Console.WriteLine ("\n установили новый тип файла - " + context.FileAccount.ContentType);
3879 // }
3880 // if (file_ext.ToLowerInvariant () == ".pdf") {
3881 // context.FileAccount.ContentType = "application/pdf";
3882 // }
3883 // if (file_ext.ToLowerInvariant () == ".xlsx") {
3884 // context.FileAccount.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
3885 // }
3886 // if (file_ext.ToLowerInvariant () == ".xls") {
3887 // context.FileAccount.ContentType = "application/vnd.ms-excel";
3888 // }
3889 // if (file_ext.ToLowerInvariant () == ".png" || file_ext.ToLowerInvariant () == ".jpg" || file_ext.ToLowerInvariant () == ".jpeg") {
3890 // context.FileAccount.ContentType = "application/image";
3891 // }
3892 // if (file_ext.ToLowerInvariant () == ".rtf") {
3893 // context.FileAccount.ContentType = "application/rtf";
3894 // }
3895 // // Если счет - не pdf, а изображение - конвертируем в pdf
3896 // if (context.FileAccount.ContentType.Contains ("image")) {
3897 // Console.WriteLine ("case = image");
3898 // context.SysLog += "\n формат счета = Image. |" + context.FileAccount.ContentType;
3899 // // Если не pdf, то сначала конвертируем в pdf
3900 // var imagepdf = new Aspose.Pdf.Document ();
3901 // // add page to pages collection of document instance
3902 // imagepdf.Pages.Add ();
3903 // Aspose.Pdf.Image image = new Aspose.Pdf.Image ();
3904 // FileStream imageStream = new FileStream (context.FileAccount.ContentFilePath, FileMode.Open);
3905 // // create Bitmap image so we can get image information
3906 // image.ImageStream = imageStream;
3907 // // add image to pagaraphs collection of first page
3908 // imagepdf.Pages [1].Paragraphs.Add (image);
3909 // imagepdf.Pages [1].PageInfo.Margin.Left = 1;
3910 // imagepdf.Pages [1].PageInfo.Margin.Top = 1;
3911 // imagepdf.Pages [1].PageInfo.Margin.Bottom = 1;
3912 // imagepdf.Pages [1].PageInfo.Margin.Right = 1;
3913 // imagepdf.Save (tmpaccfile.ContentFilePath, Aspose.Pdf.SaveFormat.Pdf);
3914 // Console.WriteLine ("Счет-картинка сохранен в pdf: " + tmpaccfile.ContentFilePath);
3915 // //account_pdf = new Aspose.Pdf.Document(tmpaccfile.ContentFilePath);
3916 // }
3917 // // Если Excel
3918 // else
3919 // if (context.FileAccount.ContentType.Contains ("ms-excel") || context.FileAccount.ContentType.Contains ("officedocument.spreadsheetml.sheet")) {
3920 // Console.WriteLine ("case = excel");
3921 // context.SysLog += "\n формат счета = Excel. |" + context.FileAccount.ContentType;
3922 // var tmpfile = InterfaceActivator.Create<BinaryFile> ();
3923 // //tmpfile.Name = "tmp.pdf";
3924 // tmpfile.Name = file_name + ".pdf";
3925 // tmpfile.InitializeContentFilePath ();
3926 // Aspose.Cells.Workbook excelpdf = new Aspose.Cells.Workbook (context.FileAccount.ContentFilePath);
3927 // excelpdf.Save (tmpaccfile.ContentFilePath, Aspose.Cells.SaveFormat.Pdf);
3928 // //account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
3929 // //Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
3930 // if (System.IO.File.Exists (tmpfile.ContentFilePath))
3931 // System.IO.File.Delete (tmpfile.ContentFilePath);
3932 // }
3933 // // Если MS Word
3934 // else
3935 // if (context.FileAccount.ContentType.Contains ("msword") || context.FileAccount.ContentType.Contains ("application/rtf") || context.FileAccount.ContentType.Contains ("/vnd.openxmlformats-officedocument.wordprocessingml.document")) {
3936 // Console.WriteLine ("case = word");
3937 // context.SysLog += "\n формат счета = Word. |" + context.FileAccount.ContentType;
3938 // var tmpfile = InterfaceActivator.Create<BinaryFile> ();
3939 // //tmpfile.Name = "tmp.pdf";
3940 // tmpfile.Name = file_name + ".pdf";
3941 // tmpfile.InitializeContentFilePath ();
3942 // //Aspose.Cells.Workbook excelpdf = new Aspose.Cells.Workbook (context.FileAccount.ContentFilePath);
3943 // Aspose.Words.Document wordpdf = new Aspose.Words.Document (context.FileAccount.ContentFilePath);
3944 // wordpdf.Save (tmpaccfile.ContentFilePath, Aspose.Words.SaveFormat.Pdf);
3945 // //account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
3946 // //Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document(tmpfile.ContentFilePath);
3947 // if (System.IO.File.Exists (tmpfile.ContentFilePath))
3948 // System.IO.File.Delete (tmpfile.ContentFilePath);
3949 // }
3950 // else
3951 // if (context.FileAccount.ContentType.Contains ("pdf")) {
3952 // //******** PDF ********************
3953 // Console.WriteLine ("case = pdf");
3954 // context.SysLog += "\n формат счета = pdf |" + context.FileAccount.ContentType;
3955 // //Console.WriteLine("попытка создать pdf из файла "+context.FileAccount.ContentFilePath);
3956 // CompressPDFPages (context.FileAccount.ContentFilePath);
3957 // System.IO.File.Copy (context.FileAccount.ContentFilePath, tmpaccfile.ContentFilePath);
3958 // //******** PDF ********************
3959 // }
3960 // else
3961 // if (context.FileAccount.ContentType.Contains ("octet-stream")) {
3962 // }
3963 // else {
3964 // }
3965 // if (System.IO.File.Exists (tmpaccfile.ContentFilePath)) {
3966 // // используя полученный файл счета в PDF объединяем его с документом служебки
3967 // //Aspose.Pdf.Document account_pdf = new Aspose.Pdf.Document (tmpaccfile.ContentFilePath);
3968 // context.FileAccountPDF = InterfaceActivator.Create<BinaryFile> ();
3969 // //context.FileAccountPDF.Name = "Счет.pdf";
3970 // context.FileAccountPDF.Name = file_name + ".pdf";
3971 // context.FileAccountPDF.CreateDate = DateTime.Now;
3972 // context.FileAccountPDF.InitializeContentFilePath ();
3973 // System.IO.File.Copy (tmpaccfile.ContentFilePath, context.FileAccountPDF.ContentFilePath);
3974 // PublicAPI.Services.File.SaveFile (context.FileAccountPDF);
3975 // }
3976 // }
3977 // }
3978 /// <summary>
3979 /// CheckValuesAfterTask1
3980 /// </summary>
3981 /// <param name="context">Контекст процесса</param>
3982 /// <param name="form"></param>
3983 public virtual bool CheckValuesAfterTask1(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
3984 {
3985 // if (context.FileAccount != null && context.FileAccountPDF == null) {
3986 // form.Notifier.Error ("Вложенный вами счет не удалось сконверировать в PDF, проверьте файл: допустимы форматы: PDF, Word, Excel, RTF, Изображения!");
3987 // return false;
3988 // }
3989 if (context.ChargeGroup == null || context.ChargeGroup2 == null || context.PaymentWay == null)
3990 {
3991 form.Notifier.Error("Не выбран тип расхода либо способ оплаты!");
3992 return false;
3993 }
3994 return true;
3995 }
3996
3997 /// <summary>
3998 /// CompressPDFPages
3999 /// Сжимаем размеры PDF страниц, если они слишком большие
4000 /// </summary>
4001 /// <param name="context">Контекст процесса</param>
4002 /// <param name="form"></param>
4003 public virtual void CompressPDFPages(string FilePath)
4004 {
4005 // *********************************************************
4006 // Сжимаем размер PDF если требуется
4007 // Проверяем размер файла
4008 // Console.WriteLine("begin");
4009 Aspose.Pdf.Document pdf_sized = new Aspose.Pdf.Document(FilePath);
4010 // Console.WriteLine("Размеры:" + pdf_sized.Pages[1].Rect.Width.ToString() +"/"+ pdf_sized.Pages[1].Rect.Height.ToString());
4011 // Пока что пытаемся сжать только если вертикальное расположение
4012 if (pdf_sized.Pages[1].Rect.Width < pdf_sized.Pages[1].Rect.Height)
4013 {
4014 Console.WriteLine("вертикальный");
4015 // Если размеры нормальные, то не трогаем
4016 if (pdf_sized.Pages[1].Rect.Width <= Aspose.Pdf.PageSize.A4.Width + 1 && pdf_sized.Pages[1].Rect.Height <= Aspose.Pdf.PageSize.A4.Height + 1)
4017 {
4018 Console.WriteLine("Нормальные размеры, не трогаем");
4019 }
4020 else
4021 {
4022 // сжимаем контент страницы
4023 int[] page_cnt1 = new int[pdf_sized.Pages.Count];
4024 for (int i = 0; i < pdf_sized.Pages.Count; i++)
4025 {
4026 page_cnt1[i] = i + 1;
4027 }
4028 Aspose.Pdf.Facades.PdfFileEditor pdd = new Aspose.Pdf.Facades.PdfFileEditor();
4029 pdd.ResizeContents(pdf_sized, page_cnt1, Aspose.Pdf.Facades.PdfFileEditor.ContentsResizeParameters.PageResize(Aspose.Pdf.PageSize.A4.Width, Aspose.Pdf.PageSize.A4.Height));
4030 // меняю размер страницы
4031 foreach (Aspose.Pdf.Page pdfPage in pdf_sized.Pages)
4032 {
4033 Console.WriteLine("islandscape =" + pdfPage.PageInfo.IsLandscape.ToString());
4034 pdfPage.SetPageSize(Aspose.Pdf.PageSize.A4.Width, Aspose.Pdf.PageSize.A4.Height);
4035 }
4036 pdf_sized.Save(FilePath);
4037 // проверка размера
4038 // Aspose.Pdf.Document pdf_sized1 = new Aspose.Pdf.Document(context.FileAccount.ContentFilePath);
4039 // Console.WriteLine("Новые размеры:" + pdf_sized1.Pages[1].Rect.Width.ToString() + "/" + pdf_sized1.Pages[1].Rect.Height.ToString());
4040 }
4041 }
4042 else
4043 {
4044 Console.WriteLine("альбомный, не трогаем");
4045 }
4046 // *********************************************************
4047 }
4048
4049 /// <summary>
4050 /// UpdateDataAfterTask1
4051 /// </summary>
4052 /// <param name="context">Контекст процесса</param>
4053 public virtual void UpdateDataAfterTask1(Context context)
4054 {
4055 context.SysLog += "\n" + DateTime.Now.ToShortTimeString() + " старт функции UpdateDataAfterTask1";
4056 // вычисляем дату платежа, по умолчанию берем + 3 рабочих дня
4057 if (context.DatePaymentPlanned == null)
4058 {
4059 context.DatePaymentPlanned = PublicAPI.Services.ProductionCalendar.EvalTargetTime(DateTime.Now, TimeSpan.FromDays(3));
4060 }
4061 // Пытаемся определить нашу компанию
4062 if (!String.IsNullOrWhiteSpace(context.INNOurCompany) && context.OurCompany == null)
4063 {
4064 var mylegalperson = EntityManager<MyLegalPerson>.Instance;
4065 string sql = "";
4066 sql = "INN='" + context.INNOurCompany + "' AND NonActive <> TRUE";
4067 var ourcompany = mylegalperson.Find(sql);
4068 if (ourcompany.Count == 1)
4069 {
4070 context.OurCompany = ourcompany.FirstOrDefault();
4071 }
4072 }
4073 // очищаем блок чтобы след. шагом его заполнить
4074 foreach (var row in context.CostItems.ToList())
4075 {
4076 row.Delete();
4077 context.CostItems.Remove(row);
4078 }
4079 switch (context.ChargeType.Value)
4080 {
4081 case "На договор":
4082 context.SysLog += "\n" + DateTime.Now.ToShortTimeString() + " на договор";
4083 if (/*context.CostItems.Count == 0 && */!String.IsNullOrWhiteSpace(context.NumbersInCRM))// если блок еще не заполнен - парсим номера заявок и достаем данные из CRM
4084 {
4085 context.SysLog += "\n" + DateTime.Now.ToShortTimeString() + " сейчас вызову ParseNumbersCRM";
4086 ParseNumbersCRM(context);
4087 }
4088 break;
4089 }
4090 if (context.OurCompany == null)
4091 {
4092 var settings = (EntitySettings)context.GetSettingsFor(c => c.OurCompany);
4093 settings.FilterQuery = "NonActive = FALSE";
4094 settings.Save();
4095 }
4096 if (context.RentContract != null)
4097 {
4098 string comment1 = "";
4099 string comment2 = "";
4100 if (context.RentContract.Contract != null)
4101 {
4102 context.ContractDocument = context.RentContract.Contract;
4103 }
4104 if (context.RentContract.LandlordINN != null)
4105 {
4106 context.ContractorINN = context.RentContract.LandlordINN;
4107 }
4108 if (context.RentContract.LandlordName != null)
4109 {
4110 context.ContractorName = context.RentContract.LandlordName != null ? context.RentContract.LandlordName.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
4111 }
4112 if (context.RentContract.MonthPayment != null)
4113 {
4114 comment1 = "Аренда за " + context.RentContract.MonthPayment.Value;
4115 }
4116 if (context.RentContract.MonthlyPayment != null)
4117 {
4118 context.SumItogoPayment = context.RentContract.MonthlyPayment;
4119 }
4120 if (context.RentContract.NDS != null)
4121 {
4122 context.HasNDS = context.RentContract.NDS;
4123 comment2 = context.HasNDS == true ? " С НДС" : " НДС НЕ облагается";
4124 }
4125 if (context.RentContract.Renter != null)
4126 {
4127 context.OurCompany = context.RentContract.Renter;
4128 }
4129 context.CommentInitiator = comment1 + comment2;
4130 }
4131 }
4132
4133 /// <summary>
4134 /// UpdateCRMDataInBlock
4135 /// </summary>
4136 /// <param name="context">Контекст процесса</param>
4137 /// <param name="form"></param>
4138 public virtual void UpdateCRMDataInBlock(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
4139 {
4140 foreach (var ni in context.CostItems)
4141 {
4142 context.SysLog += "ищем в CRM по сделке " + ni.NumAppCRM;
4143 // 1. Считаем суммарный расход по заявке с учетом добавленных сумм: берем сумму из штампа + пробегаем по таблице
4144 //var ni = InterfaceActivator.Create<P_ClCash4Contractor_CostItems> ();
4145 //ni.NumAppCRM = sdelka;
4146 //ni.SumCash = 0;
4147 //ni.SumPayment = 0;
4148 if (context.ContractorName != null)
4149 {
4150 ni.ContractorName = context.ContractorName != null ? context.ContractorName.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
4151 }
4152 // if (sdelkasplit.Count () == 1) {
4153 // if (context.SumItogoPayment > 0) {
4154 // ni.SumPayment = context.SumItogoPayment;
4155 // }
4156 // if (context.SumItogoCash > 0) {
4157 // ni.SumCash = context.SumItogoCash;
4158 // }
4159 // }
4160 CRMData obj = GetContractDataFromTerrasoftCRM(ni.NumAppCRM);
4161 ni.ContractSum = obj.ContractSum;
4162 ni.Customer = obj.CustomerName + "(ИНН:" + obj.CustomerINN.ToString() + ")";
4163 ni.CRMOurCompany = obj.OurCompanyName;
4164 ni.CRMOurCompanyINN = obj.OurCompanyINN;
4165 context.CRMCustomers += ni.Customer + "\n";
4166 ni.ContractCurrency = obj.ContractCurrency;
4167 ni.ContractNumber = obj.ContractNumber;
4168 ni.ContractDate = obj.ContractDate;
4169 ni.ContractAppendixPosition = obj.ContractAppendixPosition;
4170 ni.AppendixDate = obj.AppendixDate;
4171 ni.SumPaid = obj.SumPaid;
4172 ni.SumSpent = obj.SumSpent;
4173 // Расход Факт
4174 ni.SumSpentPlan = obj.SumSpentPlan;
4175 // Расход План.
4176 ni.SumReturn = obj.SumReturn;
4177 ni.RetroFactSum = obj.RetroFactSum;
4178 ni.RetroFactCurrency = obj.RetroFactCurrency;
4179 ni.SumSpentDescription = obj.SumSpentDescription;
4180 ni.DocState = obj.DocState;
4181 ni.CostPrice = obj.CostPrice;
4182 ni.Manager = obj.Manager;
4183 if (obj.Manager != null)
4184 {
4185 ni.ManagerName = obj.Manager.FullName;
4186 }
4187 else
4188 {
4189 ni.ManagerName = obj.ManagerLogin;
4190 }
4191 ni.Customer = obj.CustomerName + "(ИНН:" + obj.CustomerINN + ")";
4192 ni.OfferType = obj.OfferType;
4193 ni.IsTender = obj.IsTender;
4194 //UpdateStampHTMLSmall(context, item);
4195 ni.StampHTML = new MvcHtmlString(UpdateStampHTMLSmall(obj, ni.SumCash, ni.SumPayment));
4196 //context.CostItems.Add (ni);
4197 CalcSumItogo(context);
4198 }
4199 UpdateHTMLinBLock(context);
4200 }
4201
4202 /// <summary>
4203 /// UpdateApprovementsStampHTML
4204 /// Обновление штампа с визами согласующих
4205 /// </summary>
4206 /// <param name="context">Контекст процесса</param>
4207 /// <param name="form"></param>
4208 public virtual void UpdateApprovementsStampHTML(Context context)
4209 {
4210 if (context.DocumentExternalPayment != null)
4211 {
4212 //Достаем последний лист согласования
4213 var approvementGroups = PublicAPI.Docflow.Tasks.GetApprovementGroupsByDocument(context.DocumentExternalPayment);
4214 //получаем все задачи согласования данного документа
4215 if (approvementGroups.Count() > 0)
4216 {
4217 var grp = approvementGroups.LastOrDefault();
4218 string hstr = @"<table class=""previewtable_stamp"" cellpadding=""0"" cellspacing=""0"">
4219 <tr>
4220 <td>Согласующий</td>
4221 <td>Время</td>
4222 <td>Решение</td>
4223 <td>Комментарий</td>
4224 </tr>";
4225 foreach (var item in grp.ApprovementList.Items)
4226 {
4227 foreach (var res in item.Results)
4228 {
4229 string appstat = "";
4230 switch (res.Status)
4231 {
4232 case ApprovalStatus.Confirm:
4233 appstat = "Согласовано";
4234 break;
4235 case ApprovalStatus.Unconfirm:
4236 appstat = "Отказ";
4237 break;
4238 case ApprovalStatus.None:
4239 appstat = "На согласовании";
4240 break;
4241 }
4242 Console.WriteLine(appstat + " " + res.Item.User.FullName + " " + res.Item.SolutionDate);
4243 string hcomment = "";
4244 if (String.IsNullOrEmpty(res.Item.Comment) == false)
4245 hcomment = res.Item.Comment;
4246 hstr += @"
4247 <tr>
4248 <td>" + res.Item.User.FullName + @"</td>
4249 <td>" + res.Item.SolutionDate + @"</td>
4250 <td>" + appstat + @"</td>
4251 <td>" + res.Item.Comment + @"</td>
4252 </tr>";
4253 }
4254 }
4255 hstr += @"</table><br>";
4256 if ((context.BookkeepersComment != null && context.BookkeepersComment != "") || (context.CashierComment != null && context.CashierComment != ""))
4257 {
4258 hstr += @"<table class=""previewtable_stamp"" cellpadding=""0"" cellspacing=""0"">
4259 <tr>
4260 <td colspan='4'>Доп.комментарии</td>
4261 </tr>
4262 <tr>
4263 <td>Сотрудник</td>
4264 <td>Комментарий</td>
4265 </tr>";
4266 if (context.BookkeepersComment != null && context.BookkeepersComment != "")
4267 {
4268 //hstr += @"<br><div><b>" + (context.Bookkeeper != null ? context.Bookkeeper.FullName : "Бухгалтер") + ":</b><span style='color:red;'>" + context.BookkeepersComment + "</span></div>";
4269 hstr += @"
4270 <tr>
4271 <td>" + (context.Bookkeeper != null ? context.Bookkeeper.FullName : "Бухгалтер") + @"</td>
4272 <td>" + context.BookkeepersComment + @"</td>
4273 </tr>";
4274 }
4275 if (context.CashierComment != null && context.CashierComment != "")
4276 {
4277 //hstr += @"<br><div><b>" + (context.Cashier != null ? context.Cashier.FullName : "Кассир") + ":</b><span style='color:red;'>" + context.CashierComment + "</span></div>";
4278 hstr += @"
4279 <tr>
4280 <td>" + (context.Cashier != null ? context.Cashier.FullName : "Кассир") + @"</td>
4281 <td>" + context.CashierComment + @"</td>
4282 </tr>";
4283 }
4284 hstr += @"</table><br>";
4285 }
4286 context.ApprovmentsStampHTML = new MvcHtmlString(hstr);
4287 }
4288 }
4289 }
4290
4291 /// <summary>
4292 /// BeforeCashTask
4293 /// </summary>
4294 /// <param name="context">Контекст процесса</param>
4295 /// <param name="form"></param>
4296 public virtual void BeforeCashTask(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
4297 {
4298 UpdateApprovementsStampHTML(context);
4299 }
4300
4301 /// <summary>
4302 /// BeforeTaskUncomfirmed
4303 /// </summary>
4304 /// <param name="context">Контекст процесса</param>
4305 /// <param name="form"></param>
4306 public virtual void BeforeTaskUncomfirmed(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
4307 {
4308 UpdateApprovementsStampHTML(context);
4309 }
4310
4311 /// <summary>
4312 /// CheckAccountDouble
4313 /// </summary>
4314 /// <param name="context">Контекст процесса</param>
4315 /// <param name="form"></param>
4316 public virtual void CheckAccountDouble(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
4317 {
4318 if (String.IsNullOrWhiteSpace(context.AccountNumber) || context.AccountDate == null || String.IsNullOrWhiteSpace(context.ContractorINN))
4319 {
4320 string hstr = "<div style='color:red;'>Для поиска дублей необходимо заполнение и № счета, и даты, и ИНН контрагента! Одно из полей не заполнено!</div>";
4321 context.MessageHTMLAccountDouble = new MvcHtmlString(hstr);
4322 }
4323 else
4324 {
4325 context.MessageHTMLAccountDouble = null;
4326 // ищем экземпляры процессов, у которых совпадают: № счета+дата+ИНН нашей компании+ИНН контрагента
4327 var filter = InterfaceActivator.Create<WorkflowInstanceFilter>();
4328 //создаем экземпляр фильтра
4329 var header = ProcessHeaderManager.Instance.Load(5051);
4330 //загружаем процесс в переменную в зависимости от id - в примере процесс приема сотрудника
4331 var contextFilterType = Locator.GetServiceNotNull<WorkflowInstanceContextService>().GetInstanceContextFilterType(header.Published);
4332 //задаем тип фильтра контекста
4333 dynamic pp = Activator.CreateInstance(contextFilterType);
4334 //создаем экземпляр фильтра по контексту
4335 pp.AccountNumber = context.AccountNumber;
4336 pp.AccountDate = context.AccountDate;
4337 pp.ContractorINN = context.ContractorINN;
4338 filter.ContextFilter = pp;
4339 //присваиваем искомое значение фильтру
4340 filter.ProcessHeader = header;
4341 //присваиваем фильтру процесс, который определили по Id
4342 var acclist = WorkflowInstanceManager.Instance.FindUsingContext(filter, null);
4343 //задаем поиск по контексту.
4344 int found = 0;
4345 if (acclist.Count > 0)
4346 {
4347 string hstr = "<div style='color:red;'>Внимание! Найдены счета с такими же реквизитами: " + acclist.Count.ToString();
4348 foreach (var p in acclist)
4349 {
4350 if (p.AsDynamic().DocumentExternalPayment.Id != context.DocumentExternalPayment.Id)
4351 {
4352 hstr += @"<br><a target='_blank' href='/Documents/Document/View/" + p.AsDynamic().DocumentExternalPayment.Id + "'>" + p.AsDynamic().DocumentExternalPayment.Name + " (" + p.AsDynamic().DocumentExternalPayment.Status + ")</a>";
4353 found += 1;
4354 }
4355 }
4356 hstr += "</div>";
4357 if (found > 0)
4358 {
4359 context.MessageHTMLAccountDouble = new MvcHtmlString(hstr);
4360 }
4361 }
4362 }
4363 }
4364
4365 // ************************************************************************************
4366 // ПРОВЕРКА КОНТРАГЕНТА И СОЗДАНИЕ ПП в 1С - начало
4367 // ************************************************************************************
4368 // Функция получения стиля раскраски для поиска контрагентов
4369 public string ReturnClassTTTr(string Value1, string Value2)
4370 {
4371 if (Value1 == Value2)
4372 {
4373 return "tt_equal";
4374 }
4375 else
4376 {
4377 return "tt_nonequal";
4378 }
4379 }
4380
4381 /// <summary>
4382 /// CheckContractorIn1C
4383 /// </summary>
4384 /// <param name="context">Контекст процесса</param>
4385 /// <param name="form"></param>
4386 public virtual void CheckContractorIn1C(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
4387 {
4388 var groupbuh = PublicAPI.Portal.Security.UserGroup.LoadOrNull(8384);
4389 if (groupbuh.Users.Contains(PublicAPI.Portal.Security.User.GetCurrentUser()))
4390 {
4391 // очищаем блок с найденными контрагентами
4392 foreach (var item in context.Contractors1C.ToList())
4393 {
4394 item.Delete();
4395 context.Contractors1C.Remove(item);
4396 }
4397 string errhtml = "";
4398 context.ErrorMessageCheckContractor1C = new MvcHtmlString(errhtml);
4399 bool is_correct = true;
4400 if (String.IsNullOrWhiteSpace(context.ContractorINN) || (context.ContractorINN.Length != 10 && context.ContractorINN.Length != 12))
4401 {
4402 //form.Notifier.Error ("Неверная длина ИНН контрагента!");
4403 errhtml += @"<p class=""red"">Неверная длина ИНН контрагента!</p>";
4404 is_correct = false;
4405 }
4406 if (String.IsNullOrWhiteSpace(context.ContractorAccount) || context.ContractorAccount.Length != 20)
4407 {
4408 //form.Notifier.Error ("Неверная длина расчетного счета!");
4409 errhtml += @"<p class=""red"">Неверная длина расчетного счета!</p>";
4410 is_correct = false;
4411 }
4412 /*if (String.IsNullOrWhiteSpace(context.ContractorBankCorracc) && context.ContractorBankCorracc.Length != 20) {
4413 form.Notifier.Error ("Неверная длина коррсчета!");
4414 is_correct = false;
4415 }*/
4416 if (String.IsNullOrWhiteSpace(context.INNOurCompany) || (context.INNOurCompany.Length != 10 && context.INNOurCompany.Length != 12))
4417 {
4418 //form.Notifier.Error ("Неверная длина ИНН нашей компании!");
4419 errhtml += @"<p class=""red"">Неверная длина ИНН нашей компании!</p>";
4420 is_correct = false;
4421 }
4422 if (is_correct == true)
4423 {
4424 context.LogIntegration1C = "";
4425 context.LogIntegration1C += "********************************************** \n " + DateTime.Now.ToString() + "\n Запуск проверки контрагента";
4426 //context.INNOurCompany = "5048048560";
4427 string OurINN = "";
4428 //"5048048560";
4429 try
4430 {
4431 if (!String.IsNullOrWhiteSpace(context.INNOurCompany))
4432 {
4433 OurINN = context.INNOurCompany;
4434 //context.ContractorINN = "7713640704";
4435 //context.ContractorName = "";
4436 //context.ContractorAccountBankBIC = "042748634";
4437 //context.ContractorAccountNumber = "30301810222000060201";
4438 //var t= Integration1С.FindCounterparty1C("5048048561","7713640704","042748634","30301810222000060201");
4439 string res_namebank = "";
4440 string res_context = "";
4441 string res_status = "";
4442 bool all_values = false;
4443 // ОБЯЗАТЕЛЬНО ПРОВЕРЯЕМ НА ЗАПОЛНЕННОСТЬ - ВСЕ ПЕРЕМЕННЫЕ ДОЛЖНЫ БЫТЬ ЗАПОЛНЕНЫ !!!!
4444 if (!String.IsNullOrWhiteSpace(OurINN) && !String.IsNullOrWhiteSpace(context.ContractorINN) && !String.IsNullOrWhiteSpace(context.ContractorBankBIK) && !String.IsNullOrWhiteSpace(context.ContractorAccount))
4445 {
4446 all_values = true;
4447 }
4448 // добавить проверки на формат ИНН, счета, БИК
4449 if (all_values == true)
4450 {
4451 context.LogIntegration1C += "\n Проверяем контрагента";
4452 JsonResult answer = Lib1C_CheckContractor(OurINN, context.ContractorINN, context.ContractorBankBIK, context.ContractorAccount, out res_context, out res_status);
4453 //Console.WriteLine("01");
4454 //Console.WriteLine ("res_namebank=" + res_namebank);
4455 //Console.WriteLine ("res_context=" + res_context);
4456 //Console.WriteLine ("res_status=" + res_status);
4457 context.LogIntegration1C += "\n res_context=" + res_context;
4458 context.LogIntegration1C += "\n res_status=" + res_status;
4459 //Console.WriteLine("res_context=" + res_context);
4460 //Console.WriteLine("res_status=" + res_status);
4461 //Console.WriteLine("answer.error=" + answer.error);
4462 //Console.WriteLine("02");
4463 //Console.WriteLine("03");
4464 if (answer.error == "")
4465 {
4466 Console.WriteLine("нет ошибки в answer.error");
4467 context.LogIntegration1C += "\n namebank=" + answer.namebank;
4468 context.LogIntegration1C += "\n bank bic=" + answer.bic;
4469 context.LogIntegration1C += "\n bank corracc=" + answer.corracc;
4470 context.ContractorBankName = answer.namebank.Replace("$", "'");
4471 context.ContractorBankCorracc = answer.corracc;
4472 if (answer.accounts.Count > 0)
4473 {
4474 context.LogIntegration1C += "\n Найдено в 1С контрагентов :" + answer.accounts.Count.ToString();
4475 foreach (var cc in answer.accounts)
4476 {
4477 context.LogIntegration1C += "\n ****************************************";
4478 context.LogIntegration1C += "\n code=" + cc.code;
4479 context.LogIntegration1C += "\n namecontr=" + cc.namecontr;
4480 context.LogIntegration1C += "\n inn=" + cc.inn;
4481 context.LogIntegration1C += "\n kpp=" + cc.kpp;
4482 context.LogIntegration1C += "\n accountnumber=" + cc.accountnumber;
4483 context.LogIntegration1C += "\n bic=" + cc.bic;
4484 context.LogIntegration1C += "\n namebank=" + cc.namebank.Replace("$", "'");
4485 context.LogIntegration1C += "\n bank coracc=" + cc.coracc;
4486 var ni = InterfaceActivator.Create<P_ClCash4Contractor_Contractors1C>();
4487 ni.Name = cc.namecontr.Replace("$", "'");
4488 ni.INN = cc.inn;
4489 ni.KPP = cc.kpp;
4490 ni.AccountNumber = cc.accountnumber;
4491 ni.BIC = cc.bic;
4492 ni.BankName = cc.namebank.Replace("$", "'");
4493 ni.Code1C = cc.code;
4494 ni.Uid1C = cc.uid;
4495 ni.Resource = "1С";
4496 ni.CorrAcc = cc.coracc;
4497 //string hstr = @"Код:" + cc.code + "<br>Наименование:" + cc.namecontr + "<br> ИНН:" + cc.inn + "<br> КПП:" + cc.kpp + "<br>Р/счет:" + cc.accountnumber + "<br> БИК:" + cc.bic + "<br>Банк:" + cc.namebank + "<br>Корр.сч.:" + cc.coracc;
4498 // Рисуем HTML с найденными контрагентами
4499 string hstr = @"<table class='tt_contractor' cellpadding='0' cellspacing='0'>";
4500 hstr += @"<tr class='tt_header'><td class='tt_c_name'>Код:</td><td>" + cc.code + @"</td></tr>";
4501 hstr += @"<tr class='" + ReturnClassTTTr(cc.namecontr.ToLower(), context.ContractorName.ToLower()) + "'><td class='tt_c_name'>Наименование:</td><td>" + cc.namecontr.Replace("$", "'") + @"</td></tr>";
4502 hstr += @"<tr class='" + ReturnClassTTTr(cc.inn, context.ContractorINN) + "'><td class='tt_c_name'>ИНН</td><td>" + cc.inn + @"</td></tr>";
4503 hstr += @"<tr class='" + ReturnClassTTTr(cc.kpp, context.ContractorKPP) + "'><td class='tt_c_name'>КПП</td><td>" + cc.kpp + @"</td></tr>";
4504 if (!String.IsNullOrWhiteSpace(cc.accountnumber))
4505 {
4506 hstr += @"<tr class='" + ReturnClassTTTr(cc.accountnumber, context.ContractorAccount) + "'><td class='tt_c_name'>Р/с</td><td>" + cc.accountnumber + @"</td></tr>";
4507 hstr += @"<tr class='" + ReturnClassTTTr(cc.bic, context.ContractorBankBIK) + "'><td class='tt_c_name'>Банк</td><td>" + cc.bic + ",<br>" + cc.namebank.Replace("$", "'") + ",<br>" + cc.coracc + @"</td></tr>";
4508 }
4509 hstr += @"</table>";
4510 ni.ContractorHTML = new MvcHtmlString(hstr);
4511 context.Contractors1C.Add(ni);
4512 }
4513 }
4514 }
4515 else
4516 {
4517 Console.WriteLine("answer.error=" + answer.error);
4518 errhtml += @"<p class=""red"">" + answer.error + @"</p>";
4519 }
4520 }
4521 else
4522 {
4523 //form.Notifier.Error("Не заполнен один из реквизитов: Наш ИНН, ИНН, БИК, Номер счета");
4524 errhtml += @"<p class=""red"">Не заполнен один из реквизитов: Наш ИНН, ИНН, БИК, Номер счета!</p>";
4525 }
4526 }
4527 else
4528 {
4529 //form.Notifier.Error("Не указан ИНН нашей организации!");
4530 errhtml += @"<p class=""red"">Не указан ИНН нашей организации!</p>";
4531 context.LogIntegration1C += "\n Не указан ИНН нашей организации!";
4532 }
4533 }
4534 catch
4535 {
4536 }
4537 context.LogIntegration1C += "\n Проверка контрагента завершена";
4538 }
4539 else
4540 {
4541 context.LogIntegration1C += "\n Неверные реквизиты контрагента";
4542 }
4543 context.ErrorMessageCheckContractor1C = new MvcHtmlString(errhtml);
4544 }
4545 else
4546 {
4547 form.Notifier.Warning("Вы не имеете полномочий для работы с платежными поручениями! Обратитесь к администратору ELMA чтобы включили вас в группу 'Счета на оплату - Доступ к интеграции с 1С'");
4548 }
4549 }
4550
4551 /// <summary>
4552 /// SendPaymentTo1C
4553 /// </summary>
4554 /// <param name="context">Контекст процесса</param>
4555 /// <param name="form"></param>
4556 public virtual void SendPaymentTo1C(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
4557 {
4558 var groupbuh = PublicAPI.Portal.Security.UserGroup.LoadOrNull(8384);
4559 if (groupbuh.Users.Contains(PublicAPI.Portal.Security.User.GetCurrentUser()))
4560 {
4561 bool is_correct = true;
4562 if (String.IsNullOrWhiteSpace(context.ContractorINN) || context.ContractorINN.Length != 10 && context.ContractorINN.Length != 12)
4563 {
4564 form.Notifier.Error("Неверная длина ИНН контрагента!");
4565 is_correct = false;
4566 }
4567 if (String.IsNullOrWhiteSpace(context.ContractorAccount) || context.ContractorAccount.Length != 20)
4568 {
4569 form.Notifier.Error("Неверная длина расчетного счета!");
4570 is_correct = false;
4571 }
4572 /*if (String.IsNullOrWhiteSpace (context.ContractorBankCorracc) || context.ContractorBankCorracc.Length != 20) {
4573 form.Notifier.Error ("Неверная длина коррсчета!");
4574 is_correct = false;
4575 }*/
4576 if (String.IsNullOrWhiteSpace(context.INNOurCompany) || context.INNOurCompany.Length != 10 && context.INNOurCompany.Length != 12)
4577 {
4578 form.Notifier.Error("Неверная длина ИНН нашей компании!");
4579 is_correct = false;
4580 }
4581 if (is_correct == true)
4582 {
4583 context.LogIntegration1C = "";
4584 context.LogIntegration1C += "********************************************** \n " + DateTime.Now.ToString() + "\n Запуск создания счета";
4585 string OurINN = "";
4586 //"5048048560";
4587 if (!String.IsNullOrWhiteSpace(context.INNOurCompany))
4588 {
4589 OurINN = context.INNOurCompany;
4590 // context.INNOurCompany;
4591 string ContractorName = context.ContractorName != null ? context.ContractorName.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
4592 string INN = context.ContractorINN;
4593 string KPP = context.ContractorKPP;
4594 string AccountNumber = context.ContractorAccount;
4595 string BIC = context.ContractorBankBIK;
4596 string Code = context.ContractorCode1C;
4597 string Uid1C = context.ContractorUid1C;
4598 double Sum = context.SumItogoPayment;
4599 string Currency = context.PaymentCurrency.CodeISONumerical.ToString();
4600 bool NDS = context.HasNDS;
4601 string Purpose = context.AccountPurpose;
4602 string Date = context.DatePaymentDoc.Value.ToString("yyyyMMdd000000");
4603 //DateTime.Today.ToString ("yyyyMMdd000000");
4604 string Loginuser = PublicAPI.Portal.Security.User.GetCurrentUser().UserName;
4605 string Responsible = null;
4606 bool Procuration = false;
4607 string processID = context.WorkflowInstance.Id.ToString();
4608 string req_context = "";
4609 string req_status = "";
4610 PPResult pp = new PPResult("", "", "null");
4611 bool all_values = true;
4612 // ОБЯЗАТЕЛЬНО ПРОВЕРЯЕМ НА ЗАПОЛНЕННОСТЬ - ВСЕ ПЕРЕМЕННЫЕ ДОЛЖНЫ БЫТЬ ЗАПОЛНЕНЫ !!!!
4613 if (String.IsNullOrWhiteSpace(OurINN))
4614 {
4615 form.Notifier.Error("Не указан ИНН нашей компании!");
4616 all_values = false;
4617 }
4618 if (String.IsNullOrWhiteSpace(ContractorName))
4619 {
4620 form.Notifier.Error("Не указано название контрагента!");
4621 all_values = false;
4622 }
4623 if (String.IsNullOrWhiteSpace(INN) || (INN.Length != 10 && INN.Length != 12))
4624 {
4625 form.Notifier.Error("Неверно указан ИНН контрагента (пустой либо длина не 10 и не 12)!");
4626 all_values = false;
4627 }
4628 if (String.IsNullOrWhiteSpace(KPP) && INN.Length == 10)
4629 {
4630 form.Notifier.Error("Не указан КПП контрагента!");
4631 all_values = false;
4632 }
4633 if (String.IsNullOrWhiteSpace(AccountNumber))
4634 {
4635 form.Notifier.Error("Не указан номер р/сч!");
4636 all_values = false;
4637 }
4638 if (String.IsNullOrWhiteSpace(BIC))
4639 {
4640 form.Notifier.Error("Не указан БИК!");
4641 all_values = false;
4642 }
4643 if (Sum <= 0)
4644 {
4645 form.Notifier.Error("Не указана сумма!");
4646 all_values = false;
4647 }
4648 if (String.IsNullOrWhiteSpace(Currency))
4649 {
4650 form.Notifier.Error("Не указана валюта!");
4651 all_values = false;
4652 }
4653 if (String.IsNullOrWhiteSpace(Purpose))
4654 {
4655 form.Notifier.Error("Не указано назначение платежа!");
4656 all_values = false;
4657 }
4658 if (String.IsNullOrWhiteSpace(Date))
4659 {
4660 form.Notifier.Error("Не указана дата ПП!");
4661 all_values = false;
4662 }
4663 // добавить проверки на формат ИНН, счета, БИК
4664 if (all_values == true)
4665 {
4666 context.LogIntegration1C += "\n Запускаем создание ПП";
4667 // try {
4668 // pp = Lib1C_CreatePPDoc (OurINN, INN, BIC, KPP, AccountNumber, ContractorName, Code, Sum, Purpose, NDS, Date, Currency, Loginuser, Responsible, Procuration, processID, out req_context, out req_status);
4669 PPResult result = new PPResult("", "", "");
4670 var CreateRequest = new PPrequest(OurINN, Code, ContractorName, INN, KPP, AccountNumber, BIC, Sum, Currency, NDS, Purpose, Date, Loginuser, Responsible, Procuration, processID, Uid1C);
4671 var client = new RestClient("http://vs83aps.sercons.local/");
4672 client.Authenticator = new HttpBasicAuthenticator("ElmaDok", "ElmaDok");
4673 var request = new RestRequest("nsi/hs/document/platezhnoeporuchenie/" + OurINN + "/" + processID, Method.POST);
4674 request.RequestFormat = DataFormat.Json;
4675 var json = JsonConvert.SerializeObject(CreateRequest);
4676 context.LogIntegration1C += "\n JSON, который отправляем в 1С: \n " + json;
4677 Console.WriteLine(json);
4678 var s = HttpUtility.UrlEncode(json);
4679 request.AddParameter("application/json", s, RestSharp.ParameterType.RequestBody);
4680 var queryResult = client.Execute(request);
4681 var statusCode = (int)queryResult.StatusCode;
4682 req_context = HttpUtility.UrlDecode(queryResult.Content);
4683 req_status = queryResult.StatusCode.ToString();
4684 Console.WriteLine(queryResult.Content);
4685 context.LogIntegration1C += "\n req_context=" + req_context;
4686 context.LogIntegration1C += "\n req_status=" + req_status;
4687 context.LogIntegration1C += "\n получили из 1С: \n " + queryResult.Content;
4688 try
4689 {
4690 result = JsonConvert.DeserializeObject<PPResult>(HttpUtility.UrlDecode(queryResult.Content));
4691 }
4692 catch
4693 {
4694 result.result = "\n не смогли распарсить json из 1с";
4695 }
4696 pp = result;
4697 context.SysLog += "\n ОК : Lib1C_CreatePPDoc выполнен";
4698 Console.WriteLine("req_context=" + req_context);
4699 Console.WriteLine("req_status=" + req_status);
4700 context.LogIntegration1C += "\n 1C вернула ";
4701 context.LogIntegration1C += "\n pp.link = " + pp.link;
4702 context.LogIntegration1C += "\n pp.file = " + pp.file;
4703 context.LogIntegration1C += "\n pp.result = " + pp.result;
4704 if (System.IO.File.Exists(pp.file))
4705 {
4706 context.URLToPPDocIn1C = new Uri(pp.link);
4707 Console.WriteLine("Файл найден, пытаемся загрузить ");
4708 context.FilePP = InterfaceActivator.Create<BinaryFile>();
4709 context.FilePP.Name = "ПП.pdf";
4710 context.FilePP.CreateDate = DateTime.Now;
4711 context.FilePP.InitializeContentFilePath();
4712 System.IO.File.Copy(pp.file, context.FilePP.ContentFilePath, true);
4713 PublicAPI.Services.File.SaveFile(context.FilePP);
4714 }
4715 else
4716 {
4717 Console.WriteLine("Файл не найден ((");
4718 }
4719 }
4720 else
4721 {
4722 form.Notifier.Error("Не заполнен один из реквизитов");
4723 }
4724 }
4725 else
4726 {
4727 form.Notifier.Error("Не указан ИНН нашей организации!");
4728 context.LogIntegration1C += "\n Не указан ИНН нашей организации!";
4729 }
4730 context.LogIntegration1C += "\n Закончили создание ПП";
4731 }
4732 else
4733 {
4734 context.LogIntegration1C += "\n Неверные реквизиты контрагента";
4735 }
4736 }
4737 else
4738 {
4739 form.Notifier.Warning("Вы не имеете полномочий для работы с платежными поручениями! Обратитесь к администратору ELMA чтобы включили вас в группу 'Счета на оплату - Доступ к интеграции с 1С'");
4740 }
4741 }
4742
4743 // ************************************************************************************
4744 // ПРОВЕРКА КОНТРАГЕНТА И СОЗДАНИЕ ПП в 1С - конец
4745 // ************************************************************************************
4746 /// <summary>
4747 /// ChangeSumWithComment
4748 /// </summary>
4749 /// <param name="context">Контекст процесса</param>
4750 /// <param name="form"></param>
4751 public virtual void ChangeSumWithComment(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
4752 {
4753 if (!String.IsNullOrWhiteSpace(context.SumChangeComment))
4754 {
4755 // if (context.NewSumCash >= 0) {
4756 PublicAPI.Docflow.Document.AddComment(context.DocumentExternalPayment, "Изменил сумму НАЛ с " + context.SumItogoCash.ToString() + " на " + context.NewSumCash.ToString() + " с комментарием: " + context.SumChangeComment);
4757 PublicAPI.Processes.WorkflowInstance.AddComment(context.WorkflowInstance, "Изменил сумму НАЛ с " + context.SumItogoCash.ToString() + " на " + context.NewSumCash.ToString() + " с комментарием: " + context.SumChangeComment);
4758 context.SumItogoCash = context.NewSumCash;
4759 // }
4760 // if (context.NewSumPayment >= 0) {
4761 PublicAPI.Docflow.Document.AddComment(context.DocumentExternalPayment, "Изменил сумму БЕЗНАЛ с " + context.SumItogoPayment.ToString() + " на " + context.NewSumPayment.ToString() + " с комментарием: " + context.SumChangeComment);
4762 PublicAPI.Processes.WorkflowInstance.AddComment(context.WorkflowInstance, "Изменил сумму БЕЗНАЛ с " + context.SumItogoPayment.ToString() + " на " + context.NewSumPayment.ToString() + " с комментарием: " + context.SumChangeComment);
4763 context.SumItogoPayment = context.NewSumPayment;
4764 // }
4765 form.Notifier.Information("Суммы изменены");
4766 context.SumChangeComment = null;
4767 }
4768 else
4769 {
4770 form.Notifier.Error("Для изменения суммы необходим комментарий с причиной изменения!");
4771 }
4772 }
4773
4774 /// <summary>
4775 /// stReplaceUserInList
4776 /// Замена пользователя в списке пользователей
4777 /// </summary>
4778 /// <param name="context">Контекст процесса</param>
4779 /// <param name="form"></param>
4780 public virtual void stReplaceUserInList(ISet<User> user_list, User user_old, User user_new)
4781 {
4782 if (user_list.Contains(user_old))
4783 {
4784 user_list.Remove(user_old);
4785 user_list.Add(user_new);
4786 }
4787 }
4788
4789 /// <summary>
4790 /// stCheckUsersForReplacements
4791 /// Проверка пользователей в списке по справочнику замещений и замена если найдены
4792 /// </summary>
4793 /// <param name="context">Контекст процесса</param>
4794 /// <param name="form"></param>
4795 public virtual void stCheckUserListForReplacements(Context context, ISet<User> user_list)
4796 {
4797 ISet<User> tmplist = user_list;
4798 var spr = EntityManager<UserSubstitutions>.Instance;
4799 foreach (var uu in tmplist.ToList())
4800 {
4801 var nuu = spr.Find("Types = 708 AND Users = " + uu.Id).FirstOrDefault();
4802 if (nuu != null)
4803 {
4804 user_list.Remove(uu);
4805 user_list.Add(nuu.SubstitutionUsers);
4806 }
4807 }
4808 }
4809
4810 /// <summary>
4811 /// SelectContractorFromList
4812 /// Подставляет в задачу реквизиты выбранного в таблице контрагента
4813 /// </summary>
4814 /// <param name="context">Контекст процесса</param>
4815 /// <param name="form"></param>
4816 public virtual void SelectContractorFromList(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
4817 {
4818 foreach (var cc in context.Contractors1C)
4819 {
4820 if (cc.Sel == true || context.Contractors1C.Count == 1)
4821 {
4822 context.ContractorCode1C = cc.Code1C;
4823 context.ContractorUid1C = cc.Uid1C;
4824 context.ContractorName = cc.Name != null ? cc.Name.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
4825 context.ContractorKPP = cc.KPP;
4826 // context.ContractorAccount = cc.AccountNumber;
4827 // context.ContractorBankBIK = cc.BIC;
4828 // context.ContractorBankCorracc = cc.CorrAcc;
4829 // context.ContractorBankName = cc.BankName;
4830 }
4831 }
4832 }
4833
4834 /// <summary>
4835 /// ConvertBinaryFileToPDF
4836 /// </summary>
4837 /// <param name="context">Контекст процесса</param>
4838 /// <param name="form"></param>
4839 public BinaryFile ConvertBinaryFileToPDF(BinaryFile resourcefile)
4840 {
4841 var infile = InterfaceActivator.Create<BinaryFile>();
4842 infile.Name = System.IO.Path.GetFileName(resourcefile.ContentFilePath);
4843 infile.InitializeContentFilePath();
4844 System.IO.File.Copy(resourcefile.ContentFilePath, infile.ContentFilePath);
4845 var tmpaccfile = InterfaceActivator.Create<BinaryFile>();
4846 tmpaccfile.Name = "tmp.pdf";
4847 tmpaccfile.InitializeContentFilePath();
4848 if (infile != null)
4849 {
4850 Console.WriteLine("тип вложения: " + infile.ContentType);
4851 /// Форматы:
4852 /// application/pdf,
4853 /// image/jpeg,
4854 /// application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
4855 /// application/vnd.ms-excel
4856 /// application/vnd.openxmlformats-officedocument.wordprocessingml.document - docx
4857 ///
4858 /// Если файл из эл. почты, то вручную проверяем формат
4859 Console.WriteLine("case = pdf");
4860 string file_name = System.IO.Path.GetFileNameWithoutExtension(infile.ContentFilePath);
4861 string file_ext = System.IO.Path.GetExtension(infile.ContentFilePath);
4862 Console.WriteLine("расширение = " + file_ext);
4863 if (file_ext.ToLowerInvariant() == ".docx")
4864 {
4865 infile.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
4866 Console.WriteLine("\n установили новый тип файла - " + infile.ContentType);
4867 }
4868 if (file_ext.ToLowerInvariant() == ".doc")
4869 {
4870 infile.ContentType = "application/msword";
4871 }
4872 if (file_ext.ToLowerInvariant() == ".pdf")
4873 {
4874 infile.ContentType = "application/pdf";
4875 }
4876 if (file_ext.ToLowerInvariant() == ".xlsx")
4877 {
4878 infile.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
4879 }
4880 if (file_ext.ToLowerInvariant() == ".xls")
4881 {
4882 infile.ContentType = "application/vnd.ms-excel";
4883 }
4884 if (file_ext.ToLowerInvariant() == ".png" || file_ext.ToLowerInvariant() == ".jpg" || file_ext.ToLowerInvariant() == ".jpeg")
4885 {
4886 infile.ContentType = "application/image";
4887 }
4888 if (file_ext.ToLowerInvariant() == ".rtf")
4889 {
4890 infile.ContentType = "application/rtf";
4891 }
4892 // Если счет - не pdf, а изображение - конвертируем в pdf
4893 if (infile.ContentType.Contains("image"))
4894 {
4895 Console.WriteLine("case = image");
4896 // Если не pdf, то сначала конвертируем в pdf
4897 var imagepdf = new Aspose.Pdf.Document();
4898 // add page to pages collection of document instance
4899 imagepdf.Pages.Add();
4900 Aspose.Pdf.Image image = new Aspose.Pdf.Image();
4901 FileStream imageStream = new FileStream(infile.ContentFilePath, FileMode.Open);
4902 // create Bitmap image so we can get image information
4903 image.ImageStream = imageStream;
4904 // add image to pagaraphs collection of first page
4905 imagepdf.Pages[1].Paragraphs.Add(image);
4906 imagepdf.Pages[1].PageInfo.Margin.Left = 1;
4907 imagepdf.Pages[1].PageInfo.Margin.Top = 1;
4908 imagepdf.Pages[1].PageInfo.Margin.Bottom = 1;
4909 imagepdf.Pages[1].PageInfo.Margin.Right = 1;
4910 imagepdf.Save(tmpaccfile.ContentFilePath, Aspose.Pdf.SaveFormat.Pdf);
4911 Console.WriteLine("Счет-картинка сохранен в pdf: " + tmpaccfile.ContentFilePath);
4912 }
4913 // Если Excel
4914 else
4915 if (infile.ContentType.Contains("ms-excel") || infile.ContentType.Contains("officedocument.spreadsheetml.sheet"))
4916 {
4917 Console.WriteLine("case = excel");
4918 var tmpfile = InterfaceActivator.Create<BinaryFile>();
4919 tmpfile.Name = file_name + ".pdf";
4920 tmpfile.InitializeContentFilePath();
4921 Aspose.Cells.Workbook excelpdf = new Aspose.Cells.Workbook(infile.ContentFilePath);
4922 Aspose.Cells.PdfSaveOptions xls_options = new Aspose.Cells.PdfSaveOptions();
4923 xls_options.AllColumnsInOnePagePerSheet = true;
4924 excelpdf.Save(tmpaccfile.ContentFilePath, xls_options);
4925 if (System.IO.File.Exists(tmpfile.ContentFilePath))
4926 System.IO.File.Delete(tmpfile.ContentFilePath);
4927 }
4928 // Если MS Word
4929 else
4930 if (infile.ContentType.Contains("msword") || infile.ContentType.Contains("application/rtf") || infile.ContentType.Contains("/vnd.openxmlformats-officedocument.wordprocessingml.document"))
4931 {
4932 Console.WriteLine("case = word");
4933 var tmpfile = InterfaceActivator.Create<BinaryFile>();
4934 tmpfile.Name = file_name + ".pdf";
4935 tmpfile.InitializeContentFilePath();
4936 Aspose.Words.Document wordpdf = new Aspose.Words.Document(infile.ContentFilePath);
4937 wordpdf.Save(tmpaccfile.ContentFilePath, Aspose.Words.SaveFormat.Pdf);
4938 if (System.IO.File.Exists(tmpfile.ContentFilePath))
4939 System.IO.File.Delete(tmpfile.ContentFilePath);
4940 }
4941 else
4942 if (infile.ContentType.Contains("pdf"))
4943 {
4944 //******** PDF ********************
4945 Console.WriteLine("case = pdf");
4946 CompressPDFPages(infile.ContentFilePath);
4947 System.IO.File.Copy(infile.ContentFilePath, tmpaccfile.ContentFilePath);
4948 //******** PDF ********************
4949 }
4950 else
4951 if (infile.ContentType.Contains("octet-stream"))
4952 {
4953 }
4954 else
4955 {
4956 }
4957 }
4958 return tmpaccfile;
4959 }
4960
4961 /// <summary>
4962 /// ConvertAllFilesToOnePDF
4963 /// </summary>
4964 /// <param name="context">Контекст процесса</param>
4965 /// <param name="form"></param>
4966 public virtual void ConvertAllFilesToOnePDF(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
4967 {
4968 BinaryFile infile = ConvertBinaryFileToPDF(context.FileAccount);
4969 //context.DocumentFile = PublicAPI.Portal.Objects.Common.Attachment.Create();
4970 context.DocumentFile = InterfaceActivator.Create<BinaryFile>();
4971 //context.DocumentFile = ConvertBinaryFileToPDF(context.FileAccount);
4972 context.DocumentFile.Name = "счет.pdf";
4973 context.DocumentFile.CreateDate = DateTime.Now;
4974 context.DocumentFile.InitializeContentFilePath();
4975 System.IO.File.Copy(infile.ContentFilePath, context.DocumentFile.ContentFilePath);
4976 PublicAPI.Services.File.SaveFile(context.DocumentFile);
4977 //context.WorkflowInstance.Initiator
4978 // var employeeList = PublicAPI.Portal.Security.OrganizationItem.GetSubordinateByUser(context.WorkflowInstance.Initiator).ToList();
4979 // List<long> list_employeeList = new List<long>();
4980 // list_employeeList.AddRange(employeeList.Select(x => x.Id));
4981 // var procMemberList = context.WorkflowInstance.Members.ToList();
4982 // List<long> list_members = new List<long>();
4983 // list_members.AddRange(procMemberList.Select(x => x.User.Id));
4984 // dynamic proc = PublicAPI.Processes.WorkflowInstance.LoadOrNull();
4985 }
4986
4987 /// <summary>
4988 /// CheckINN
4989 /// </summary>
4990 /// <param name="context">Контекст процесса</param>
4991 /// <param name="form"></param>
4992 public virtual void CheckINN(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
4993 {
4994 if (context.ContractorINN.Length != 10 && context.ContractorINN.Length != 12)
4995 {
4996 form.Notifier.Error("Неверная длина ИНН контрагента!");
4997 }
4998 }
4999
5000 /// <summary>
5001 /// CheckContractorAccount
5002 /// </summary>
5003 /// <param name="context">Контекст процесса</param>
5004 /// <param name="form"></param>
5005 public virtual void CheckContractorAccount(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
5006 {
5007 if (context.ContractorAccount.Length != 20)
5008 {
5009 form.Notifier.Error("Неверная длина расчетного счета!");
5010 }
5011 }
5012
5013 /// <summary>
5014 /// CheckCorrAcc
5015 /// </summary>
5016 /// <param name="context">Контекст процесса</param>
5017 /// <param name="form"></param>
5018 public virtual void CheckCorrAcc(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
5019 {
5020 if (context.ContractorBankCorracc.Length != 20)
5021 {
5022 form.Notifier.Error("Неверная длина коррсчета!");
5023 }
5024 }
5025
5026 /// <summary>
5027 /// CheckIfOurCompanyIntegration1COn
5028 /// Проверка, включена ли интеграция с 1С по данной нашей компании
5029 /// </summary>
5030 /// <param name="context">Контекст процесса</param>
5031 /// <param name="form"></param>
5032 public virtual void CheckIfOurCompanyIntegration1COn(Context context)
5033 {
5034 context.Integration1C = false;
5035 // ищем значение в справочнике параметров Справочники-Служебные параметры для процессов
5036 // ищем параметр "OurCompanyINNs_wich_Intergation1C_isOn"
5037 //var session = Locator.GetServiceNotNull<ISessionProvider> ().GetSession ("");
5038 //var items = session.CreateQuery ("from CustomWorkflowParameters where Name = 'OurCompanyINNs_wich_Intergation1C_isOn'").List<CustomWorkflowParameters> ();
5039 var items = EntityManager<CustomWorkflowParameters>.Instance.Find("Name = 'OurCompanyINNs_wich_Intergation1C_isOn'");
5040 string INNs_string = items.First().StringValue.ToString();
5041 // парсим полученную строку на список ИНН
5042 if (!String.IsNullOrWhiteSpace(INNs_string))
5043 {
5044 string[] innsplit = Regex.Split(INNs_string, @"\D+");
5045 innsplit = innsplit.Distinct().ToArray();
5046 // проверяем, принадлежит ли наш ИНН данному списку
5047 if (innsplit.ToList().Count > 0)
5048 {
5049 foreach (var inn in innsplit)
5050 {
5051 if (inn == context.INNOurCompany)
5052 {
5053 context.Integration1C = true;
5054 }
5055 }
5056 }
5057 }
5058 }
5059
5060 /// <summary>
5061 /// CheckINNOurCompany
5062 /// </summary>
5063 /// <param name="context">Контекст процесса</param>
5064 /// <param name="form"></param>
5065 public virtual void CheckINNOurCompany(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
5066 {
5067 if (context.INNOurCompany.Length != 10 && context.INNOurCompany.Length != 12)
5068 {
5069 form.Notifier.Error("Неверная длина ИНН нашей компании!");
5070 }
5071 //Проверка, включена ли интеграция с 1С по данной нашей компании
5072 CheckIfOurCompanyIntegration1COn(context);
5073 }
5074
5075 /// <summary>
5076 /// SetDateBuhTaskFinish
5077 /// </summary>
5078 /// <param name="context">Контекст процесса</param>
5079 public virtual void SetDateBuhTaskFinish(Context context)
5080 {
5081 context.DateBuhTaskFinish = DateTime.Now.AddDays(1);
5082 }
5083
5084 /// <summary>
5085 /// DivideSumEqually
5086 /// </summary>
5087 /// <param name="context">Контекст процесса</param>
5088 /// <param name="form"></param>
5089 public virtual void DivideSumEqually(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
5090 {
5091 int rowcount = context.CostItems.Count;
5092 double r_sumcash = Math.Floor(context.SumItogoCash / rowcount);
5093 double r_sumcash_ost = r_sumcash + (context.SumItogoCash - r_sumcash * rowcount);
5094 double r_sumpayment = Math.Floor(context.SumItogoPayment / rowcount);
5095 double r_sumpayment_ost = r_sumpayment + (context.SumItogoPayment - r_sumpayment * rowcount);
5096 int rowi = 0;
5097 foreach (var row in context.CostItems)
5098 {
5099 rowi += 1;
5100 row.SumCash = r_sumcash;
5101 row.SumPayment = r_sumpayment;
5102 if (rowi == rowcount)
5103 {
5104 row.SumCash = r_sumcash_ost;
5105 row.SumPayment = r_sumpayment_ost;
5106 }
5107 }
5108 UpdateHTMLinBLock(context);
5109 CalcSumItogo(context);
5110 }
5111
5112 /// <summary>
5113 /// SetPaymentResultFrom1C
5114 /// </summary>
5115 /// <param name="context">Контекст процесса</param>
5116 /// <param name="data"></param>
5117 /// <param name="messageType"></param>
5118 /// <param name="isTerminated"></param>
5119 public virtual void SetPaymentResultFrom1C(Context context, EleWise.ELMA.Common.Models.WebData data, EleWise.ELMA.Workflow.Models.IWorkflowMessageType messageType, bool isTerminated)
5120 {
5121 if (context.PaymentResultFrom1C == true)
5122 {
5123 context.PaymentStatusFromBank = "Оплачен";
5124 // пытаюсь преобразовать дату
5125 try
5126 {
5127 if (!String.IsNullOrWhiteSpace(context.DatePaidBankString))
5128 {
5129 DateTime bankdate = DateTime.Today;
5130 DateTime.TryParse(context.DatePaidBankString, out bankdate);
5131 context.DatePaidBankCommited = bankdate;
5132 }
5133 }
5134 catch
5135 {
5136 }
5137 }
5138 if (context.PaymentResultFrom1C == false)
5139 {
5140 context.PaymentStatusFromBank = "Отказ банка";
5141 }
5142 if (context.PaymentResultFrom1C == null)
5143 {
5144 context.PaymentStatusFromBank = "Ошибка";
5145 }
5146 }
5147
5148 /// <summary>
5149 /// SelectContractorAndAccountFromList
5150 /// </summary>
5151 /// <param name="context">Контекст процесса</param>
5152 /// <param name="form"></param>
5153 public virtual void SelectContractorAndAccountFromList(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
5154 {
5155 foreach (var cc in context.Contractors1C)
5156 {
5157 if (cc.Sel == true || context.Contractors1C.Count == 1)
5158 {
5159 context.ContractorCode1C = cc.Code1C;
5160 context.ContractorUid1C = cc.Uid1C;
5161 context.ContractorName = cc.Name != null ? cc.Name.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
5162 context.ContractorKPP = cc.KPP;
5163 context.ContractorAccount = cc.AccountNumber;
5164 context.ContractorBankBIK = cc.BIC;
5165 context.ContractorBankCorracc = cc.CorrAcc;
5166 context.LogIntegration1C += "\n добавляем Коррсчет =" + cc.CorrAcc;
5167 context.LogIntegration1C += "\n теперь Коррсчет =" + context.ContractorBankCorracc;
5168 context.ContractorBankName = cc.BankName;
5169 }
5170 }
5171 }
5172
5173 /// <summary>
5174 /// GetWayApprovement
5175 /// </summary>
5176 /// <param name="context">Контекст процесса</param>
5177 /// <param name="form"></param>
5178 public virtual void GetWayApprovement(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
5179 {
5180 try
5181 {
5182 Console.WriteLine("4869");
5183 // **************************************************************
5184 // 0: ОЧИЩАЕМ ДАННЫЕ
5185 // **************************************************************
5186 // 0.1 очищаем блок с маршрутом
5187 foreach (var row in context.WayApprovement.ToList())
5188 {
5189 context.WayApprovement.Remove(row);
5190 //row.Delete ();
5191 }
5192 Console.WriteLine("4878");
5193 context.SysLog += "1";
5194 // **************************************************************
5195 // 0.2 очищаем зоны ответственности
5196 // Очищаем согласующих на случай если это повторно согласование
5197 //context.Chief // непоср. рук-ль - определяется при запуске, не трогаем
5198 //context.FilialCurators.Clear ();
5199 //ПЕРЕНЕСТИ В ИЗМЕНЕНИЯ ФИЛИАЛ
5200 // куратор филиала
5201 //context.ManagersForApprovement.Clear (); /// ПЕРЕНЕСТИ ПРИ ИЗМЕНЕНИИ ПОЛЯ CRM
5202 // менеджеры
5203 context.SecurityUsersForApprovement.Clear();
5204 // СБ
5205 context.ChargeTypeApprovementUsers.Clear();
5206 // согласующий по типу расхода
5207 context.ResponsiblesBookkeepers.Clear();
5208 // проверяющий бухгалтер
5209 // context.ExecutorsForApprovement.Clear(); // исп.блок не очищаем, поскольку он вручную назначается, можем сбить, не нужно
5210 context.ResponsiblesGeneralDirector.Clear();
5211 // директор
5212 context.AdditionalApprovementUsers.Clear();
5213 // доп. согласующий
5214 //context.AdditionalApprovementUsersFInitiator.Clear ();
5215 // доп. согласующий от инициатора
5216 if (form != null)
5217 {
5218 form.For(c => c.Chief).Visible(false);
5219 form.For(c => c.FilialCurators).Visible(false);
5220 form.For(c => c.ManagersForApprovement).Visible(false);
5221 form.For(c => c.ExecutorsForApprovement).Visible(false);
5222 }
5223 // **************************************************************
5224 // 0.3 сбрасываем признак Определены все зоны = true
5225 bool AllApproversAreFound = true;
5226 // **************************************************************
5227 // 0.4 сбрасываем признаки Требуется согласование с.. = false
5228 bool is_needed_chief = false;
5229 // нужно ли согласование с непоср. руководителем
5230 bool is_needed_managers = false;
5231 // нужно ли согласование с менеджерами
5232 bool is_needed_ispblock = false;
5233 // нужно ли согласование с Исп. блоком
5234 bool is_needed_sb = false;
5235 // нужно ли согласование с СБ
5236 bool is_needed_buch = false;
5237 // нужно ли проверить бухгалтером
5238 bool is_needed_director = false;
5239 // нужно ли согласование с директором
5240 bool is_needed_ecology = false;
5241 //нужно согласовывать с Иванниковой расходы по экологич. услугам
5242 bool is_needed_retro_tender = false;
5243 //нужно согласовывать с Фроловым И ретро по тендерам
5244 Console.WriteLine("4930");
5245 //********************************************
5246 // создаем список пользователей, кто уже участвует в процессе, чтобы сверять с ним на дубли
5247 List<User> just_members = new List<User>();
5248 just_members.Add(context.Initiator);
5249 // **************************************************************
5250 // 1. ОПРЕДЕЛЯЕМ, КАКИЕ ЗОНЫ НУЖНЫ
5251 // **************************************************************
5252 Console.WriteLine("4941");
5253 context.SysLog += "2";
5254 if (context.ChargeGroup2 != null)
5255 {
5256 // ************************************************
5257 // 1 непоср. рук-ль (если Москва)
5258 if (context.ChargeGroup2.AskApprovementChiefOrCurator == true)
5259 {
5260 is_needed_chief = true;
5261 if (context.Filial != null && context.Filial.Name == "Москва")
5262 {
5263 if (context.Chief == null)
5264 {
5265 form.For(c => c.Chief).Visible(true).Required(true).ReadOnly(false);
5266 AllApproversAreFound = false;
5267 }
5268 }
5269 // !!!!! вставлять куратора !!
5270 if (context.Filial.Name != "Москва" && context.FilialCurators.Count == 0)
5271 {
5272 form.For(c => c.FilialCurators).Visible(true).Required(true).ReadOnly(false);
5273 AllApproversAreFound = false;
5274 }
5275 }
5276 if ((context.Initiator.UserName == "travel" || context.Initiator.UserName == "Sekretar1" || context.Initiator.UserName == "PonomarevaMM" || context.Initiator.UserName == "NikiforovaVD" || context.Initiator.UserName == "GladkihED") & (context.ChargeGroup2.Name == "Проживание" || context.ChargeGroup2.Name == "Билеты"))
5277 {
5278 is_needed_chief = false;
5279 // НЕ нужно согласовывать с руководителем
5280 context.SysLog += "\nРуководитель не нужен условие";
5281 }
5282 context.SysLog += "3";
5283 //(с)Бушев - Данилюк
5284 var uu_cash300 = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 0");
5285 var CashAndPayment = context.SumItogoCash.Value + context.SumItogoPayment.Value;
5286 if ((context.SumItogoCash.Value >= 300000 || context.SumItogoPayment.Value >= 300000 || CashAndPayment >= 300000) && (context.ChargeGroup2.Name != "Ретро"))
5287 {
5288 Console.Write("Закупка Выше300");
5289 // Если сумма выплаты больше 300000, то добавляем согласующего из справочника "Ответственные в задачах"
5290 uu_cash300 = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1718");
5291 if (uu_cash300.Count > 0)
5292 {
5293 context.ChargeTypeApprovementUsers.AddAll(uu_cash300.First().ResponsibleUsers);
5294 }
5295 }
5296 context.SysLog += "14";
5297 //(с)Бушев
5298
5299 //(с)Бушев - Пододняя
5300 var uu_ExtracurricularWork = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 0");
5301 if (context.ChargeGroup2.Name == "Внеурочная работа")
5302 {
5303 Console.Write("Внеурочная работа");
5304 // Если вид расходов "Внеуросная работа", то добавляем согласующего из справочника "Ответственные в задачах" - "Согласование Внеурочная работа"
5305 uu_ExtracurricularWork = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1819");
5306 if (uu_ExtracurricularWork.Count > 0)
5307 {
5308 context.ChargeTypeApprovementUsers.AddAll(uu_ExtracurricularWork.First().ResponsibleUsers);
5309 }
5310 }
5311 context.SysLog += "15";
5312 //(с)Бушев
5313
5314 // ************************************************
5315 // 2 куратор филиала (если не Москва)
5316 //########## ПОИСК - КУРАТОР ФИЛИАЛА
5317 // if (context.Filial != null) {
5318 // var row = EntityManager<Branches>.Instance.Find ("LinkOrganizationItem = " + context.Filial.Id);
5319 // if (row.Count > 0 && row.First ().Curators.Count > 0) {
5320 // context.FilialCurators.AddAll (row.First ().Curators);
5321 // }
5322 // }
5323 // ************************************************
5324 // 3 согласующий по типу расхода
5325 if (context.ChargeGroup2.Users.Count > 0)
5326 {
5327 context.ChargeTypeApprovementUsers.AddAll(context.ChargeGroup2.Users);
5328 }
5329 context.SysLog += "4";
5330 // ************************************************
5331 // 4 менеджеры
5332 // Условия по менеджерам
5333 // 1) если на договор и есть CRM - то нужны
5334 if (context.ChargeType.Value == "На договор" && context.CostItems.Count > 0)
5335 {
5336 is_needed_managers = true;
5337 // 2) кроме - если Инициатор = менеджер
5338 // Определяем, является ли инициатор менеджером
5339 // ------------------------------------------------------------
5340 context.InitiatorIsManager = false;
5341 // признак "является ли менеджером"
5342 OrganizationItem unit_manager = context.Position;
5343 // старт поиска начинаем с должности
5344 while (unit_manager.ParentItem != null && context.InitiatorIsManager == false)
5345 {
5346 if (unit_manager.Name == "Группа продаж")
5347 {
5348 context.InitiatorIsManager = true;
5349 }
5350 unit_manager = unit_manager.ParentItem;
5351 }
5352 // ------------------------------------------------------------
5353 if (context.InitiatorIsManager == true)
5354 {
5355 context.SysLog += "\nМенеджер=инициатор";
5356 is_needed_managers = false;
5357 }
5358 // 3) кроме - если ВИд расхода = Субподряд И есть в справочнике исключений, кому из отделов не нужно согласовывать с менеджерами
5359 // ****** определяем список сотрудников, которым не требуется предв. согласование с менеджерами *********
5360 var uu_nonman = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 607");
5361 List<User> nonmans = new List<User>();
5362 // nonmans -это список менеджеров-исключений
5363 foreach (var uun in uu_nonman)
5364 {
5365 nonmans.AddRange(uun.ResponsibleUsers.ToList());
5366 }
5367 // *************************************************************************************
5368 if (nonmans.Contains(context.Initiator) == true && (context.ChargeGroup2.NameFull.ToLowerInvariant().Contains("субподряд")/*|| context.ChargeGroup2.NameFull.ToLowerInvariant ().Contains ("оборудовани")*/))
5369 {
5370 is_needed_managers = false;
5371 // НЕ нужно согласовывать с менеджерами
5372 context.SysLog += "\nМенеджер не нужен условие 1";
5373 }
5374 // 4) кроме - если Инициатор=Офис-менеджер и вид расхода Проживание или Билеты
5375 if ((context.Initiator.UserName == "travel" || context.Initiator.UserName == "PonomarevaMM" || context.Initiator.UserName == "Sekretar1" || context.Initiator.UserName == "NikiforovaVD" || context.Initiator.UserName == "GladkihED") & (context.ChargeGroup2.Name == "Проживание" || context.ChargeGroup2.Name == "Билеты"))
5376 {
5377 is_needed_managers = false;
5378 // НЕ нужно согласовывать с менеджерами
5379 context.SysLog += "\nМенеджер не нужен условие 2";
5380 }
5381 // 10) кроме - если Инициатор=Офис-менеджер и вид расхода Проживание или Билеты
5382 if ((context.Initiator.UserName == "travel" || context.Initiator.UserName == "PonomarevaMM" || context.Initiator.UserName == "Sekretar1" || context.Initiator.UserName == "NikiforovaVD" || context.Initiator.UserName == "GladkihED") & (context.ChargeGroup2.Name == "Проживание" || context.ChargeGroup2.Name == "Билеты"))
5383 {
5384 is_needed_sb = false;
5385 // НЕ нужно согласовывать с Службой безопасности
5386 context.SysLog += "\nСлужба безопасности не нужна условие 10";
5387 }
5388 // 5) Если Инициатор = Иванов Юрий Владимирович, то не согласовывать с менеджерами
5389 if (context.Initiator.Id == 1206)
5390 {
5391 is_needed_managers = false;
5392 // НЕ нужно согласовывать с менеджерами
5393 context.SysLog += "\nМенеджер не нужен условие 2";
5394 }
5395 // @@@@@ определяем менеджеров из блока с CRM
5396 if (is_needed_managers == true)
5397 {
5398 if (context.CostItems.ToList().Exists(x => x.Manager != null))
5399 {
5400 context.CostItems.ToList().ForEach(x => context.ManagersForApprovement.Add(x.Manager));
5401 // заполняем зону менеджеры
5402 // проверить нет ли Инициатора среди них
5403 // проверить нет ли уже в других зонах - при добавлении в маршрут !!!
5404 }
5405 else
5406 {
5407 if (context.ManagersForApprovement.Count > 0)
5408 {
5409 }
5410 else
5411 {
5412 // запросить указать менеджеров !!!!!!!
5413 AllApproversAreFound = false;
5414 context.SysLog += "\nМенеджер не указан!";
5415 form.For(c => c.ManagersForApprovement).Visible(true).Required(true).ReadOnly(false);
5416 }
5417 }
5418 }
5419 }
5420 context.SysLog += "5";
5421 // конец если На договор
5422 // ************************************************
5423 // 5 ИСП БЛОК
5424 // 5.0 исп. блок нужен если инициатор - сам является менеджером
5425 if (context.ChargeType.Value == "На договор" && context.CostItems.Count > 0 && context.InitiatorIsManager == true)
5426 {
5427 is_needed_ispblock = true;
5428 // 5.1 кроме: бензин меньше 2000
5429 if (context.ChargeGroup2.Name == "Бензин" && context.SumItogoPayment < 2000 && context.SumItogoCash < 2000)
5430 {
5431 is_needed_ispblock = false;
5432 }
5433 // 5.2 кроме: ретро, билеты, проживание
5434 if (context.ChargeGroup2.Name == "Ретро" || context.ChargeGroup2.Name == "Билеты" || context.ChargeGroup2.Name == "Проживание")
5435 {
5436 is_needed_ispblock = false;
5437 }
5438 }
5439 context.SysLog += "6";
5440 // исли нужен исп. блок и он пустой, то запрашиваем
5441 //######## ПОИСК - ИСП.БЛОК - УКАЗАТЬ
5442 if (is_needed_ispblock == true)
5443 {
5444 if (context.ExecutorsForApprovement.Count == 0)
5445 {
5446 // запрашиваем исп. блок !!!!!!!
5447 AllApproversAreFound = false;
5448 form.For(c => c.ExecutorsForApprovement).Visible(true).Required(true).ReadOnly(false);
5449 }
5450 else
5451 {
5452 bool AllApproversAreExecutors = true;
5453 // признак "все ли указанные являются ли исполнителями"
5454 foreach (var approver in context.ExecutorsForApprovement.ToList())
5455 {
5456 //bool isispblock = false;
5457 // Если Григорьев, то не проверяем
5458 if (approver.UserName == "PododnyayaA" || approver.UserName == "BozkurtI" || approver.UserName == "GrigorievAA" || approver.UserName == "FilatchevAP" || approver.UserName == "FilatchevPP" || approver.UserName == "ElnikovaEM" || approver.UserName == "VorobyovaK" || approver.UserName == "KrylovaUA" || approver.UserName == "ershov")
5459 {
5460 }
5461 else
5462 {
5463 Console.WriteLine("исполнитель - " + approver.FullName);
5464 List<string> parent_unit_names = new List<string>();
5465 //OrganizationItem unit = approver.OrganizationItems.FirstOrDefault();
5466 OrganizationItem unit = approver.OrganizationItems.ToArray().Union(approver.OrganizationGroups).FirstOrDefault();
5467 Console.WriteLine("первый отдел - " + unit.Name);
5468 while (unit.ParentItem != null)
5469 {
5470 Console.WriteLine(unit.Name);
5471 parent_unit_names.Add(unit.Name);
5472 unit = unit.ParentItem;
5473 }
5474 //if (isispblock == false)
5475 if (!parent_unit_names.Contains("Исполнительный блок") && !parent_unit_names.Contains("Лаборатория"))
5476 {
5477 AllApproversAreExecutors = false;
5478 form.Notifier.Error("Ошибка: " + approver.FullName + ", указанный в поле \"Согласующий от отдела исполнителя\" не является сотрудником исполнительного блока.");
5479 form.For(c => c.ExecutorsForApprovement).Visible(true).Required(true).ReadOnly(false);
5480 }
5481 }
5482 }
5483 if (AllApproversAreExecutors == false)
5484 {
5485 AllApproversAreFound = false;
5486 }
5487 }
5488 }
5489 context.SysLog += "7";
5490 // ДЛЯ ЭКОЛОГИИ
5491 // если хоть в одной строке блока с CRM есть экология - добавляем Иванникову А.
5492 foreach (var row in context.CostItems)
5493 {
5494 if (row.OfferType.Contains("Эколог") || row.OfferType.Contains("гидрометеорологические"))
5495 {
5496 is_needed_ecology = true;
5497 }
5498 }
5499 Console.WriteLine("5112");
5500 // ********** ------******************
5501 // ********** РЕТРО ******************
5502 // ********** ------******************
5503 if (context.ChargeGroup2.Name == "Ретро")
5504 {
5505 is_needed_chief = false;
5506 is_needed_managers = false;
5507 is_needed_ispblock = false;
5508 is_needed_sb = false;
5509 is_needed_buch = false;
5510 is_needed_ecology = false;
5511 context.ChargeTypeApprovementUsers.Clear();
5512 context.ChargeTypeApprovementUsers.Add(PublicAPI.Portal.Security.User.LoadByLogin("GorbachyovEN"));
5513 // Добавляем согласующего для Москвы
5514 var uu_retro = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 0");
5515 if ((context.Filial != null && context.Filial.Name == "Москва") || context.Filial == null)
5516 {
5517 Console.Write(" Москва");
5518 if (context.PaymentWay.Value == "Наличный расчет")
5519 {
5520 Console.Write(" наличка");
5521 // ЕСЛИ Москва и нал - - берем значение из справочника "Ответственные по задачам", с параметром "Согласующий РЕТРО Москва-НАЛ"
5522 uu_retro = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1416");
5523 if (uu_retro.Count > 0)
5524 {
5525 context.ChargeTypeApprovementUsers.AddAll(uu_retro.First().ResponsibleUsers);
5526 }
5527 }
5528 else
5529 {
5530 Console.Write(" безнал");
5531 // ЕСЛИ Москва и безнал - Пастухова А. - берем значение из справочника "Ответственные по задачам", с параметром "Согласующий РЕТРО Москва-БЕЗНАЛ"
5532 uu_retro = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1415");
5533 if (uu_retro.Count > 0)
5534 {
5535 context.ChargeTypeApprovementUsers.AddAll(uu_retro.First().ResponsibleUsers);
5536 }
5537 }
5538 }
5539 else
5540 {
5541 Console.Write(" филиал");
5542 if (context.PaymentWay.Value == "Наличный расчет")
5543 {
5544 Console.Write(" наличка");
5545 // ЕСЛИ Филиалы - - берем значение из справочника "Ответственные по задачам", с параметром "Согласующий РЕТРО Филиалы-нал"
5546 uu_retro = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1517");
5547 if (uu_retro.Count > 0)
5548 {
5549 context.ChargeTypeApprovementUsers.AddAll(uu_retro.First().ResponsibleUsers);
5550 }
5551 }
5552 else
5553 {
5554 Console.Write(" безнал");
5555 // ЕСЛИ Филиалы - - берем значение из справочника "Ответственные по задачам", с параметром "Согласующий РЕТРО Филиалы-безнал"
5556 uu_retro = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1516");
5557 if (uu_retro.Count > 0)
5558 {
5559 context.ChargeTypeApprovementUsers.AddAll(uu_retro.First().ResponsibleUsers);
5560 }
5561 }
5562 }
5563 // РЕТРО + Тендер : если Тендер, то добавить Фролова И.
5564 foreach (var row in context.CostItems)
5565 {
5566 if (row.IsTender == true)
5567 {
5568 is_needed_retro_tender = true;
5569 }
5570 }
5571 if (is_needed_retro_tender == true)
5572 {
5573 // ЕСЛИ РЕТРО и Тендеры - берем значение из справочника "Ответственные по задачам", с параметром "Согласующий РЕТРО Тендер"
5574 var uu_retro_tender = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1318");
5575 if (uu_retro_tender.Count > 0)
5576 {
5577 context.ChargeTypeApprovementUsers.AddAll(uu_retro_tender.First().ResponsibleUsers);
5578 }
5579 }
5580 }
5581 Console.WriteLine("5132");
5582 // ************************************************
5583 // 6 СЛУЖБА БЕЗОПАСНОСТИ
5584 if (context.ChargeType.Value == "На договор")
5585 {
5586 // Если на договор и сумма Оплачено = 0, то должно быть согласование с СБ
5587 is_needed_sb = false;
5588 foreach (var item in context.CostItems)
5589 {
5590 if (item.SumPaid <= 0)
5591 {
5592 is_needed_sb = true;
5593 }
5594 }
5595 //######## ПОИСК - СЛУЖБА БЕЗОПАСНОСТИ
5596 if (is_needed_sb == true)
5597 {
5598 var uu_sb = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 412");
5599 if (uu_sb.Count > 0)
5600 {
5601 context.SecurityUsersForApprovement.AddAll(uu_sb.First().ResponsibleUsers);
5602 }
5603 }
5604 }
5605 context.SysLog += "8";
5606 // *****************************************
5607 // ОПРЕДЕЛЕНИЕ ОТВЕТСТВЕННЫХ - ПРОВЕРЯЮЩИЙ БУХГАЛТЕР (БЮДЖЕТНЫЙ КОНТРОЛЕР)
5608 // *****************************************
5609 if (context.ChargeGroup2.AskCheckBookkeeper == true)
5610 {
5611 is_needed_buch = true;
5612 // //####### ПОИСК - БУХГАЛТЕР
5613 // // для Авансов - проверяет Николаева О.
5614 // if (context.ChargeGroup2.Name == "Аванс") {
5615 // var uu102 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 809");
5616 // // проверяющий авансы - Николаева О.
5617 // if (uu102.Count > 0) {
5618 // context.ResponsiblesBookkeepers.AddAll (uu102.First ().ResponsibleUsers);
5619 // }
5620 // }
5621 // else
5622 // if (context.ChargeGroup2.Name == "Аванс %") {
5623 // var uu102 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 910");
5624 // // проверяющий авансы % - Подолян Ю.
5625 // if (uu102.Count > 0) {
5626 // context.ResponsiblesBookkeepers.AddAll (uu102.First ().ResponsibleUsers);
5627 // }
5628 // }
5629 // else// для остальных - проверяет Моторина В.
5630 // {
5631 // var uu102 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 406");
5632 // // проверяющий бухгалтер по всем расходам
5633 // if (uu102.Count > 0) {
5634 // context.ResponsiblesBookkeepers.AddAll (uu102.First ().ResponsibleUsers);
5635 // }
5636 // }
5637 var accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 406");
5638 switch (context.ChargeGroup2.Name)
5639 {
5640 case "Аванс":
5641 // проверяющий авансы - Николаева О.
5642 accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 809");
5643 if (accauntants.Count > 0)
5644 {
5645 context.ResponsiblesBookkeepers.AddAll(accauntants.First().ResponsibleUsers);
5646 }
5647 break;
5648 case "Аванс %":
5649 accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 910");
5650 // проверяющий авансы % - Подолян Ю.
5651 if (accauntants.Count > 0)
5652 {
5653 context.ResponsiblesBookkeepers.AddAll(accauntants.First().ResponsibleUsers);
5654 }
5655 break;
5656 case "Ретро":
5657 // проверяющий РЕТРО
5658 accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1617");
5659 if (accauntants.Count > 0)
5660 {
5661 context.ResponsiblesBookkeepers.AddAll(accauntants.First().ResponsibleUsers);
5662 }
5663 break;
5664 default:
5665 bool found_ResponsiblesBookkeepers = false;
5666 //если в процессе указана компания, то сначала ищем проверяющего по всем расходам по компании
5667 if (context.OurCompany != null)
5668 {
5669 accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 406");
5670 if (accauntants.Count > 0)
5671 {
5672 foreach (var item in accauntants)
5673 {
5674 if (item.OurCompanies.Count > 0 && item.OurCompanies.Contains(context.OurCompany) == true)
5675 {
5676 context.ResponsiblesBookkeepers.AddAll(item.ResponsibleUsers);
5677 found_ResponsiblesBookkeepers = true;
5678 }
5679 }
5680 }
5681 }
5682 // если не найден по компании, тогда
5683 // проверяющий бухгалтер по всем расходам
5684 if (found_ResponsiblesBookkeepers == false)
5685 {
5686 accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 406 AND OurCompanies is EMPTY");
5687 if (accauntants.Count > 0)
5688 {
5689 context.ResponsiblesBookkeepers.AddAll(accauntants.First().ResponsibleUsers);
5690 found_ResponsiblesBookkeepers = true;
5691 }
5692 }
5693 break;
5694 }
5695 }
5696 context.SysLog += "9";
5697 // *****************************************
5698 // ОПРЕДЕЛЕНИЕ ДИРЕКТОРА (ФИНАЛЬНЫЕ СОГЛАСУЮЩИЕ)
5699 // *****************************************
5700 // 8.1 если есть куратор-директор по отделу, то берем в любом случае
5701 // Директор 1: сначала директора ищем в справочнике Виды ответственности по совпадению отдела, за которые он отвечает
5702 var uu104 = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 408");
5703 // 2) ищем все вышестоящие подразделения у выбранного отдела
5704 List<OrganizationItem> parents = new List<OrganizationItem>();
5705 OrganizationItem unitex = context.Unit;
5706 while (unitex.ParentItem != null)
5707 {
5708 parents.Add(unitex);
5709 Console.WriteLine(unitex.Name);
5710 unitex = unitex.ParentItem;
5711 }
5712 context.SysLog += ";10";
5713 // 3) сравниваем, если наш отдел содержится у согласующего, то добваляем в поле Согласующие
5714 if (uu104.Count > 0)
5715 {
5716 // находим все записи с типом "Согласующий директор" и пробегаем по каждой чтобы сравнить с искомым отделом
5717 foreach (var sdir in uu104)
5718 {
5719 foreach (var sdir_unit in sdir.Units)
5720 {
5721 if (parents.Contains(sdir_unit))
5722 {
5723 is_needed_director = true;
5724 context.ResponsiblesGeneralDirector.AddAll(sdir.ResponsibleUsers);
5725 // Console.WriteLine ("Директор - нашли по отделу ");
5726 }
5727 }
5728 }
5729 }
5730 context.SysLog += ";11";
5731 Console.WriteLine("5210");
5732 if (is_needed_director == false && context.ChargeGroup2.AskApprovementDirector == true)
5733 {
5734 is_needed_director = true;
5735 Console.WriteLine("5213");
5736 // Директор 2: если для заданного отдела не нашли директора, то берем из справочника Типы расходов
5737 if (context.ResponsiblesGeneralDirector.Count == 0 && uu104.Count > 0)
5738 {
5739 Console.WriteLine("5217");
5740 if (context.ChargeGroup2.DirectorZoneUsers.Count > 0)
5741 {
5742 context.ResponsiblesGeneralDirector.AddAll(context.ChargeGroup2.DirectorZoneUsers);
5743 Console.WriteLine("Директор - берем из типов расходов");
5744 }
5745 else
5746 {
5747 // Директор 3: если же и в справочнике Типы расходов не указан директор, то находим директора по умолчанию из справочника Виды ответственности (т.е. у которого не указаны отделы)
5748 foreach (var sdir in uu104)
5749 {
5750 if (sdir.Units.Count == 0)
5751 {
5752 context.ResponsiblesGeneralDirector.AddAll(sdir.ResponsibleUsers);
5753 // Console.WriteLine ("Директор - берем из видов ответственности для всех (финотдел)");
5754 }
5755 }
5756 }
5757 }
5758 }
5759 Console.WriteLine("5230");
5760 context.SysLog += ";11_1";
5761 if ((context.Initiator.UserName == "travel" || context.Initiator.UserName == "PonomarevaMM" || context.Initiator.UserName == "Sekretar1" || context.Initiator.UserName == "NikiforovaVD" || context.Initiator.UserName == "GladkihED") & (context.ChargeGroup2.Name == "Проживание" || context.ChargeGroup2.Name == "Билеты"))
5762 {
5763 is_needed_director = false;
5764 // НЕ нужно согласовывать с директором
5765 context.SysLog += "\nДиректор не нужен условие 2";
5766 }
5767 if ((context.Initiator.UserName == "travel" || context.Initiator.UserName == "PonomarevaMM" || context.Initiator.UserName == "Sekretar1" || context.Initiator.UserName == "NikiforovaVD" || context.Initiator.UserName == "GladkihED") & (context.ChargeGroup2.Name == "Проживание" || context.ChargeGroup2.Name == "Билеты"))
5768 {
5769 is_needed_sb = false;
5770 ;
5771 // НЕ нужно согласовывать со Службой безопасности
5772 context.SysLog += "\nСлужба безопасности не нужа условие 10";
5773 }
5774 // *****************************************
5775 // ОПРЕДЕЛЕНИЕ ИСПОЛНИТЕЛЕЙ ЗАДАЧИ "ОПЛАТИТЬ СЧЕТ" - БУХГАЛТЕР, КАССИР
5776 // *****************************************
5777 // Бухгалтер по расчетам
5778 context.Bookkeepers.Clear();
5779 var uu204 = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 410");
5780 if (uu204.Count > 0)
5781 {
5782 context.Bookkeepers.AddAll(uu204.First().ResponsibleUsers);
5783 }
5784 // Кассиры
5785 context.Cashiers.Clear();
5786 var uu205 = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 411");
5787 if (uu205.Count > 0)
5788 {
5789 context.Cashiers.AddAll(uu205.First().ResponsibleUsers);
5790 }
5791 context.SysLog += ";13";
5792 }
5793 context.SysLog += "\n" + AllApproversAreFound.ToString() + "\n";
5794 // ПРОВЕРЯЕМ ВСЕ ЛИ ЗАПОЛНЕНЫ, ЕСЛИ НЕТ, ТО ДАЛЬШЕ НЕ ИДЕМ
5795 if (AllApproversAreFound == true)
5796 {
5797 // ######## ЭТАП 1 #############
5798 var ni = InterfaceActivator.Create<P_ClCash4Contractor_WayApprovement>();
5799 ni.Stage = 1;
5800 ni.Step = context.WayApprovement.Count + 1;
5801 ni.Comment = "Предварительное согласование";
5802 // 1.РУКОВОДИТЕЛЬ
5803 if (is_needed_chief == true && context.Chief != null)
5804 {
5805 // если филиал
5806 if (context.Filial.Name != "Москва" && context.FilialCurators.Count > 0)
5807 {
5808 ni.ApprovementUsers.AddAll(context.FilialCurators);
5809 }
5810 else
5811 {
5812 ni.ApprovementUsers.Add(context.Chief);
5813 // ИНДИВИДУАЛЬНОЕ УСЛОВИЕ
5814 // Если руководитель = Лебедев К, то добавляем Гайцук А.
5815 if (context.Chief.UserName == "LebedevKO")
5816 {
5817 try
5818 {
5819 ni.ApprovementUsers.Add(PublicAPI.Portal.Security.User.LoadByLogin("GajtcukAV"));
5820 }
5821 catch
5822 {
5823 }
5824 }
5825 }
5826 }
5827 context.SysLog += ";2-1";
5828 // 2. СОГЛ-Й ПО ТИПУ РАСХОДА
5829 if (context.ChargeTypeApprovementUsers.Count > 0)
5830 {
5831 List<User> resp_charge = new List<User>();
5832 resp_charge.AddRange(context.ChargeTypeApprovementUsers.ToList());
5833 //проверка, чтобы Инициатор не попал
5834 if (resp_charge.Contains(context.Employee))
5835 {
5836 resp_charge.Remove(context.Employee);
5837 }
5838 // проверяю на наличие в других блоках
5839 foreach (var row in context.WayApprovement)
5840 {
5841 foreach (var usr in row.ApprovementUsers)
5842 {
5843 if (resp_charge.Contains(context.Employee))
5844 {
5845 resp_charge.Remove(context.Employee);
5846 }
5847 }
5848 }
5849 if (resp_charge.Count > 0)
5850 {
5851 ni.ApprovementUsers.AddAll(resp_charge.ToList());
5852 }
5853 }
5854 context.SysLog += ";2-2";
5855 // 3. МЕНЕДЖЕРЫ
5856 if (is_needed_managers == true && context.ManagersForApprovement.Count > 0)
5857 {
5858 if (context.CostItems.ToList().Exists(x => x.Manager != null))
5859 {
5860 foreach (var cost in context.CostItems)
5861 {
5862 // проверяю на наличие в других блоках
5863 bool m_found = false;
5864 foreach (var row in context.WayApprovement)
5865 {
5866 if (row.ApprovementUsers.Contains(cost.Manager))
5867 {
5868 m_found = true;
5869 }
5870 }
5871 if (m_found != true && !String.IsNullOrWhiteSpace(cost.NumAppCRM) && cost.Manager != null && cost.Manager != context.Employee)
5872 {
5873 ni.ApprovementUsers.Add(cost.Manager);
5874 }
5875 }
5876 }
5877 else
5878 {
5879 if (context.ManagersForApprovement.Count > 0)
5880 {
5881 ni.ApprovementUsers.AddAll(context.ManagersForApprovement);
5882 }
5883 }
5884 }
5885 // ДЛЯ ЭКОЛОГИИ
5886 // если хоть в одной строке блока с CRM есть экология - добавляем Иванникову А
5887 if (is_needed_ecology == true)
5888 {
5889 ni.ApprovementUsers.Add(PublicAPI.Portal.Security.User.LoadByLogin("IvannikovaAY"));
5890 }
5891 context.SysLog += ";2-3";
5892 // 4. ИСП. БЛОК
5893 if (is_needed_ispblock == true && context.ExecutorsForApprovement.Count > 0)
5894 {
5895 List<User> resp_isp = new List<User>();
5896 resp_isp.AddRange(context.ExecutorsForApprovement.ToList());
5897 //проверка, чтобы Инициатор не попал
5898 if (resp_isp.Contains(context.Employee))
5899 {
5900 resp_isp.Remove(context.Employee);
5901 }
5902 // проверяю на наличие в других блоках
5903 foreach (var row in context.WayApprovement)
5904 {
5905 foreach (var usr in row.ApprovementUsers)
5906 {
5907 if (resp_isp.Contains(context.Employee))
5908 {
5909 resp_isp.Remove(context.Employee);
5910 }
5911 }
5912 }
5913 if (resp_isp.Count > 0)
5914 {
5915 ni.ApprovementUsers.AddAll(resp_isp.ToList());
5916 }
5917 }
5918 context.SysLog += ";2-4";
5919 // 5. СЛУЖБА БЕЗОПАСНОСТИ
5920 if (is_needed_sb == true)
5921 {
5922 ni.ApprovementUsers.AddAll(context.SecurityUsersForApprovement.ToList());
5923 }
5924 // проверяем на дубли
5925 foreach (var usr in ni.ApprovementUsers.ToList())
5926 {
5927 if (just_members.Contains(usr) == true)
5928 {
5929 ni.ApprovementUsers.Remove(usr);
5930 }
5931 }
5932 if (ni.ApprovementUsers.Count > 0)
5933 {
5934 stCheckUserListForReplacements(context, ni.ApprovementUsers);
5935 context.WayApprovement.Add(ni);
5936 just_members.AddRange(ni.ApprovementUsers);
5937 }
5938 context.SysLog += ";2-5";
5939 // ######## ЭТАП 1 #############
5940 // 6. ДИРЕКТОР
5941 List<User> resp_dir = new List<User>();
5942 if (is_needed_director == true && context.ResponsiblesGeneralDirector.Count > 0)
5943 {
5944 resp_dir.AddRange(context.ResponsiblesGeneralDirector.ToList());
5945 //проверка, чтобы Инициатор не попал
5946 if (resp_dir.Contains(context.Employee))
5947 {
5948 resp_dir.Remove(context.Employee);
5949 }
5950 }
5951 // Директор для РЕТРО
5952 if (context.ChargeGroup2.Name == "Ретро")
5953 {
5954 Console.WriteLine("да ретро");
5955 context.ResponsiblesGeneralDirector.Clear();
5956 var uu_retro = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 0");
5957 if ((context.Filial != null && context.Filial.Name == "Москва") || context.Filial == null)
5958 {
5959 Console.Write(" Москва");
5960 if (context.PaymentWay.Value == "Наличный расчет")
5961 {
5962 Console.Write(" наличка");
5963 // ЕСЛИ Москва и нал - - берем значение из справочника "Ответственные по задачам", с параметром "Согласующий РЕТРО Москва-НАЛ"
5964 uu_retro = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1315");
5965 if (uu_retro.Count > 0)
5966 {
5967 context.ResponsiblesGeneralDirector.AddAll(uu_retro.First().ResponsibleUsers);
5968 }
5969 }
5970 else
5971 {
5972 Console.Write(" безнал");
5973 // ЕСЛИ Москва и безнал - Пастухова А. - берем значение из справочника "Ответственные по задачам", с параметром "Согласующий РЕТРО Москва-БЕЗНАЛ"
5974 uu_retro = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1314");
5975 if (uu_retro.Count > 0)
5976 {
5977 context.ResponsiblesGeneralDirector.AddAll(uu_retro.First().ResponsibleUsers);
5978 }
5979 }
5980 }
5981 else
5982 {
5983 Console.Write(" филиал");
5984 if (context.PaymentWay.Value == "Наличный расчет")
5985 {
5986 Console.Write(" наличка");
5987 // ЕСЛИ Филиалы - - берем значение из справочника "Ответственные по задачам", с параметром "Согласующий РЕТРО Филиалы-нал"
5988 uu_retro = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1317");
5989 if (uu_retro.Count > 0)
5990 {
5991 context.ResponsiblesGeneralDirector.AddAll(uu_retro.First().ResponsibleUsers);
5992 }
5993 }
5994 else
5995 {
5996 Console.Write(" безнал");
5997 // ЕСЛИ Филиалы - - берем значение из справочника "Ответственные по задачам", с параметром "Согласующий РЕТРО Филиалы-безнал"
5998 uu_retro = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 1316");
5999 if (uu_retro.Count > 0)
6000 {
6001 context.ResponsiblesGeneralDirector.AddAll(uu_retro.First().ResponsibleUsers);
6002 }
6003 }
6004 }
6005 resp_dir.AddRange(context.ResponsiblesGeneralDirector.ToList());
6006 //проверка, чтобы Инициатор не попал
6007 if (resp_dir.Contains(context.Employee))
6008 {
6009 resp_dir.Remove(context.Employee);
6010 }
6011 }
6012 if (resp_dir.Count > 0)
6013 {
6014 // проверяю на наличие в других блоках
6015 foreach (var row in context.WayApprovement)
6016 {
6017 foreach (var usr in row.ApprovementUsers)
6018 {
6019 if (resp_dir.Contains(context.Employee))
6020 {
6021 resp_dir.Remove(context.Employee);
6022 }
6023 }
6024 }
6025 }
6026 if (resp_dir.Count > 0)
6027 {
6028 // добавляем в маршрут
6029 ni = InterfaceActivator.Create<P_ClCash4Contractor_WayApprovement>();
6030 ni.Step = context.WayApprovement.Count + 1;
6031 ni.Stage = 1;
6032 ni.ApprovementUsers.AddAll(resp_dir);
6033 //ni.AnyUser = true;
6034 ni.Comment = "Согласующий";
6035 // проверяем на дубли
6036 foreach (var usr in ni.ApprovementUsers.ToList())
6037 {
6038 if (just_members.Contains(usr) == true)
6039 {
6040 ni.ApprovementUsers.Remove(usr);
6041 }
6042 }
6043 if (ni.ApprovementUsers.Count > 0)
6044 {
6045 stCheckUserListForReplacements(context, ni.ApprovementUsers);
6046 context.WayApprovement.Add(ni);
6047 just_members.AddRange(ni.ApprovementUsers);
6048 }
6049 }
6050 // доп согласующий от инициатора
6051 //context.AdditionalApprovementUsersFInitiator
6052 List<User> resp_dop = new List<User>();
6053 if (context.AdditionalApprovementUsersFInitiator.Count > 0)
6054 {
6055 resp_dop.AddRange(context.AdditionalApprovementUsersFInitiator.ToList());
6056 //проверка, чтобы Инициатор не попал
6057 if (resp_dop.Contains(context.Employee))
6058 {
6059 resp_dop.Remove(context.Employee);
6060 }
6061 }
6062 if (resp_dop.Count > 0)
6063 {
6064 // проверяю на наличие в других блоках
6065 foreach (var row in context.WayApprovement)
6066 {
6067 foreach (var usr in row.ApprovementUsers)
6068 {
6069 if (resp_dop.Contains(context.Employee))
6070 {
6071 resp_dop.Remove(context.Employee);
6072 }
6073 }
6074 }
6075 }
6076 if (resp_dop.Count > 0)
6077 {
6078 // добавляем в маршрут
6079 ni = InterfaceActivator.Create<P_ClCash4Contractor_WayApprovement>();
6080 ni.Step = context.WayApprovement.Count + 1;
6081 ni.Stage = 1;
6082 ni.ApprovementUsers.AddAll(resp_dop);
6083 //ni.AnyUser = true;
6084 ni.Comment = "Доп. согласующий, назначенный инициатором";
6085 // проверяем на дубли
6086 foreach (var usr in ni.ApprovementUsers.ToList())
6087 {
6088 if (just_members.Contains(usr) == true)
6089 {
6090 ni.ApprovementUsers.Remove(usr);
6091 }
6092 }
6093 if (ni.ApprovementUsers.Count > 0)
6094 {
6095 stCheckUserListForReplacements(context, ni.ApprovementUsers);
6096 context.WayApprovement.Add(ni);
6097 just_members.AddRange(ni.ApprovementUsers);
6098 }
6099 }
6100 // ######## ЭТАП 2 #############
6101 // 6. БУХГАЛТЕР
6102 if (is_needed_buch == true)
6103 {
6104 ni = InterfaceActivator.Create<P_ClCash4Contractor_WayApprovement>();
6105 ni.Step = context.WayApprovement.Count + 1;
6106 ni.Stage = 2;
6107 ni.ApprovementUsers.AddAll(context.ResponsiblesBookkeepers);
6108 //ni.AnyUser = true;
6109 ni.Comment = "Бюджетный контролер (Бухгалтер, проверяет корректность заполнения)";
6110 stCheckUserListForReplacements(context, ni.ApprovementUsers);
6111 context.WayApprovement.Add(ni);
6112 }
6113 context.SysLog += "\n5317";
6114 }
6115 // конец if (AllApproversAreFound == true)
6116 }
6117 catch (Exception ex)
6118 {
6119 foreach (var row in context.WayApprovement.ToList())
6120 {
6121 context.WayApprovement.Remove(row);
6122 //row.Delete ();
6123 }
6124 if (form != null)
6125 {
6126 form.Notifier.Error(context.SysLog.ToString() + " ||| " + ex);
6127 }
6128 }
6129 }
6130
6131 /// <summary>
6132 /// CreateDopRouteApprovement1
6133 /// </summary>
6134 /// <param name="context">Контекст процесса</param>
6135 public virtual void CreateDopRouteApprovement1(Context context)
6136 {
6137 //Dictionary<string, List<User>> responsibles = new Dictionary<string, List<User>> ();
6138 // if (context.ApproversDop1.Count > 0) {
6139 // //responsibles ["Повторное согласование"] = context.ApproversDop1.ToList ();
6140 // // убираем из проведенных согласований решения выбранных доп. согласующих, если они отрицательные
6141 // var approvementGroups = PublicAPI.Docflow.Tasks.GetApprovementGroupsByDocument (context.DocumentExternalPayment);
6142 // //получаем все задачи согласования данного документа
6143 // var grp = approvementGroups.LastOrDefault ();
6144 // foreach (var item in grp.ApprovementList.Items) {
6145 // if (context.ApproversDop1.Contains (item.User)) {
6146 // item.Delete ();
6147 // grp.ApprovementList.Items.Remove (item);
6148 // }
6149 // }
6150 // var StageGuid = new Guid ();
6151 // int stagenum = context.RouteApprovement.StageApprovementList.Count;
6152 // //1;
6153 // //context.IfApprovementIsNeeded = true;
6154 // var stage = EntityManager<StageApprovement>.Instance.Create ();
6155 // //сознание этапа
6156 // stage.ExecutionType = ApprovementExecutionType.Parallel;
6157 // stage.UseFirstExecutor = false;
6158 // //тип согласования
6159 // stage.Users.AddAll (context.ApproversDop1.ToList ());
6160 // //пользователи
6161 // stage.Name = "Повторное согласование";
6162 // stagenum += 1;
6163 // stage.Number = stagenum;
6164 // stage.TimeInterval = TimeSpan.FromDays (1);
6165 // //stage.InitialStageGuid = StageGuid;
6166 // if (context.RouteApprovement.StageApprovementList.Count > 0) {
6167 // stage.InitialStageGuid = context.RouteApprovement.StageApprovementList.Last ().Uid;
6168 // }
6169 // StageGuid = stage.Uid;
6170 // stage.Save ();
6171 // context.RouteApprovement.StageApprovementList.Add (stage);
6172 // context.RouteApprovement.Save ();
6173 // }
6174 }
6175
6176 /// <summary>
6177 /// CheckExtensionsForFile
6178 /// </summary>
6179 /// <param name="context">Контекст процесса</param>
6180 /// <param name="form"></param>
6181 public virtual void CheckExtensionsForFile(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6182 {
6183 bool IsCorrect = true;
6184 if (context.FileAccount != null && System.IO.File.Exists(context.FileAccount.ContentFilePath) && !validextensions_list.Contains(System.IO.Path.GetExtension(context.FileAccount.ContentFilePath)))
6185 {
6186 IsCorrect = false;
6187 }
6188 if (IsCorrect == false)
6189 {
6190 form.Notifier.Error("В поле Счет вложен файл недопустимого формата! Разрешены только файлы Word, Excel, PDF и изображения.");
6191 }
6192 }
6193
6194 /// <summary>
6195 /// CheckExtentionsForOneAttachment
6196 /// </summary>
6197 /// <param name="context">Контекст процесса</param>
6198 /// <param name="form"></param>
6199 public virtual void CheckExtentionsForOneAttachment(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6200 {
6201 bool IsCorrect = true;
6202 if (context.ContractDocument != null && context.ContractDocument.File != null && System.IO.File.Exists(context.ContractDocument.File.ContentFilePath) && !validextensions_list.Contains(System.IO.Path.GetExtension(context.ContractDocument.File.ContentFilePath)))
6203 {
6204 IsCorrect = false;
6205 }
6206 if (IsCorrect == false)
6207 {
6208 form.Notifier.Error("В поле Договор вложен файл недопустимого формата! Разрешены только файлы Word, Excel, PDF и изображения.");
6209 }
6210 }
6211
6212 /// <summary>
6213 /// CheckExtensionsForManyAttachments
6214 /// </summary>
6215 /// <param name="context">Контекст процесса</param>
6216 /// <param name="form"></param>
6217 public virtual void CheckExtensionsForManyAttachments(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6218 {
6219 bool IsCorrect = true;
6220 foreach (var attachment in context.Attachments)
6221 {
6222 if (attachment.File != null && System.IO.File.Exists(attachment.File.ContentFilePath) && !validextensions_list.Contains(System.IO.Path.GetExtension(attachment.File.ContentFilePath)))
6223 {
6224 IsCorrect = false;
6225 break;
6226 }
6227 }
6228 if (IsCorrect == false)
6229 {
6230 form.Notifier.Error("В поле Приложения к договору вложен файл недопустимого формата! Разрешены только файлы Word, Excel, PDF и изображения.");
6231 }
6232 }
6233
6234 /// <summary>
6235 /// CheckValuesStep1
6236 /// </summary>
6237 /// <param name="context">Контекст процесса</param>
6238 /// <param name="form"></param>
6239 public virtual bool CheckValuesStep1(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6240 {
6241 if (context.ChargeType == null || context.PaymentWay == null || context.ChargeGroup == null || context.ChargeGroup2 == null)
6242 {
6243 form.Notifier.Error("Некоторые из полей не заполнены! (Вид расхода, способ оплаты, группа и тип расходов)");
6244 return false;
6245 }
6246 else
6247 {
6248 // if ((context.PaymentWay.Value == "Безналичный расчет" || context.PaymentWay.Value == "Наличный+безналичный") && !(context.Initiator.Id == 1130 || context.Initiator.Id == 1530 || (context.ChargeGroup != null && context.ChargeGroup.Name == "Обеспечение тендерных заявок и договоров") || context.ChargeGroup.Name == "Расходы руководства")) {
6249 // form.Notifier.Error ("Запуск счетов безналично запрещен в период с 24.12.18 до 08.01.19. При необходимости - согласуйте с Лашковой О.Ф.");
6250 // return false;
6251 // }
6252 }
6253 // GetPostForItem (context, form);
6254 // FindEmployeeBoss (context, form);
6255 // Заполняем выбор значениями, доступными согласно справочника
6256 // Если Расход на протокол, то скрываем поле Номера сделок CRM, показываем Приложения
6257 if (context.ChargeGroup2.Name == "Расходы на протокол" && context.Attachments.Count == 0)
6258 {
6259 form.Notifier.Warning("Нужно загрузить приложения к служебке!");
6260 return false;
6261 }
6262 // Если выбран способ оплаты - показываем Счет
6263 if ((context.PaymentWay.Value.Contains("Безналичный расчет") || context.PaymentWay.Value.Contains("Наличный+безналичный")) && context.ChargeGroup.Name != "Деньги в пути" && !context.ChargeGroup2.Name.Contains("Возврат") && context.FileAccount == null)
6264 {
6265 form.Notifier.Warning("Нужно загрузить счёт к служебке!");
6266 return false;
6267 }
6268 return true;
6269 }
6270
6271 /// <summary>
6272 /// CheckBeforeAskCorrection
6273 /// </summary>
6274 /// <param name="context">Контекст процесса</param>
6275 /// <param name="form"></param>
6276 public virtual bool CheckBeforeAskCorrection(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6277 {
6278 if (String.IsNullOrWhiteSpace(context.CorrectorComments))
6279 {
6280 form.Notifier.Error("Необходимо указать замечания в поле 'Комментарии/вопросы для инициатора'");
6281 return false;
6282 }
6283 return true;
6284 }
6285
6286 /// <summary>
6287 /// CalcDateToBePayed
6288 /// </summary>
6289 /// <param name="context">Контекст процесса</param>
6290 public virtual void CalcDateToBePayed(Context context)
6291 {
6292 Random rnd = new Random();
6293 int minutes = rnd.Next(1, 59);
6294 context.DateToBePayedCalculated = context.DatePaymentDoc.Value.AddHours(18).AddMinutes(minutes);
6295 }
6296
6297 //---------------------------------------------------НЕТ ССЫЛОК НА СЦЕНАРИЙ В ПРОЦЕССЕ---------------------------------------------------------------
6298 /// <summary>
6299 /// GetApproversForWayApprovement
6300 /// </summary>
6301 /// <param name="context">Контекст процесса</param>
6302 /// <param name="form"></param>
6303 // public virtual void GetApproversForWayApprovement (Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6304 // {
6305 // // Очищаем согласующих на случай если это повторно согласование
6306 // context.FilialCurators.Clear ();
6307 // context.ManagersForApprovement.Clear ();
6308 // context.SecurityUsersForApprovement.Clear ();
6309 // context.ChargeTypeApprovementUsers.Clear ();
6310 // context.ResponsiblesBookkeepers.Clear ();
6311 // context.ResponsiblesFinanceDepartment.Clear ();
6312 // // СНАЧАЛА ОПРЕДЕЛЯЮ ВСЕХ ОВТЕТСТВЕННЫХ И ПРОВЕРЯЮ ИХ ДОСТАТОЧНОСТЬ
6313 // // ЕСЛИ ВСЕ ОПРЕДЕЛЕНЫ - ФОРМИРУЮ МАРШРУТ
6314 // // ИНАЧЕ - ЗАПРАШИВАЮ УКАЗАТЬ НЕДОСТАЮЩИХ
6315 // // *********************************
6316 // // 1: ОПРЕДЕЛЯЕМ ЗОНЫ ОТВЕТСТВЕННОСТИ
6317 // // 1) обязательно необходимы: если на договор, то либо менеджер либо исп. блок.
6318 // // 2) если филиал - обязательно куратор (из справочника филиалов)
6319 // // *********************************
6320 // // ПОИСК - СОГЛАСУЮЩИЕ ПО ВИДУ РАСХОДА
6321 // if (context.ChargeGroup2 != null && context.ChargeGroup2.Users.Count > 0) {
6322 // context.ChargeTypeApprovementUsers.AddAll (context.ChargeGroup2.Users);
6323 // }
6324 // // ПОИСК - МЕНЕДЖЕРЫ
6325 // // определяем список сотрудников, которым не требуется предв. согласование с менеджерами
6326 // var uu_nonman = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 607");
6327 // List<User> nonmans = new List<User> ();
6328 // foreach (var uun in uu_nonman) {
6329 // nonmans.AddRange (uun.ResponsibleUsers.ToList ());
6330 // }
6331 // if (nonmans.Contains (context.Initiator) == true && (context.ChargeGroup2.NameFull.ToLowerInvariant ().Contains ("субподряд")/*|| context.ChargeGroup2.NameFull.ToLowerInvariant ().Contains ("оборудовани")*/)) {
6332 // Console.WriteLine ("не нужно согласовывать с менеджерами");
6333 // }
6334 // else {
6335 // Console.WriteLine ("нужно согласовывать с менеджерами");
6336 // if (context.CostItems.Count > 0 && context.CostItems.ToList ().Exists (x => x.Manager != null)) {
6337 // context.CostItems.ToList ().ForEach (x => context.ManagersForApprovement.Add (x.Manager));
6338 // }
6339 // }
6340 // // Определяем, является ли инициатор менеджером
6341 // context.InitiatorIsManager = false;
6342 // if (context.Position != null) {
6343 // // признак "является ли менеджером"
6344 // OrganizationItem unit_manager = context.Position;
6345 // // старт поиска начинаем с должности
6346 // while (unit_manager.ParentItem != null && context.InitiatorIsManager == false) {
6347 // if (unit_manager.Name == "Группа продаж") {
6348 // context.InitiatorIsManager = true;
6349 // }
6350 // unit_manager = unit_manager.ParentItem;
6351 // }
6352 // }
6353 // else {
6354 // context.SysLog += "Не указана должность";
6355 // Console.WriteLine ("Не указана должность");
6356 // }
6357 // // ПОИСК - СЛУЖБА БЕЗОПАСНОСТИ
6358 // var uu_sb = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 412");
6359 // if (uu_sb.Count > 0) {
6360 // context.SecurityUsersForApprovement.AddAll (uu_sb.First ().ResponsibleUsers);
6361 // }
6362 // // ПОИСК - КУРАТОР ФИЛИАЛА
6363 // if (context.Filial != null) {
6364 // var row = EntityManager<Branches>.Instance.Find ("LinkOrganizationItem = " + context.Filial.Id);
6365 // if (row.Count > 0 && row.First ().Curators.Count > 0) {
6366 // context.FilialCurators.AddAll (row.First ().Curators);
6367 // }
6368 // }
6369 // else {
6370 // context.SysLog += "Не указан филиал";
6371 // Console.WriteLine ("Не указан филиал");
6372 // }
6373 // Console.WriteLine ("5550");
6374 // // *****************************************
6375 // // ОПРЕДЕЛЕНИЕ ОТВЕТСТВЕННЫХ - ПРОВЕРЯЮЩИЙ БУХГАЛТЕР (БЮДЖЕТНЫЙ КОНТРОЛЕР)
6376 // // *****************************************
6377 // var accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 406");
6378 // switch (context.ChargeGroup2.Name) {
6379 // case "Аванс":
6380 // // проверяющий авансы - Николаева О.
6381 // accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 809");
6382 // if (accauntants.Count > 0) {
6383 // context.ResponsiblesBookkeepers.AddAll (accauntants.First ().ResponsibleUsers);
6384 // }
6385 // break;
6386 // case "Аванс %":
6387 // accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 910");
6388 // // проверяющий авансы % - Подолян Ю.
6389 // if (accauntants.Count > 0) {
6390 // context.ResponsiblesBookkeepers.AddAll (accauntants.First ().ResponsibleUsers);
6391 // }
6392 // break;
6393 // case "Ретро":
6394 // // проверяющий РЕТРО
6395 // accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 1617");
6396 // if (accauntants.Count > 0) {
6397 // context.ResponsiblesBookkeepers.AddAll (accauntants.First ().ResponsibleUsers);
6398 // }
6399 // break;
6400 // default:
6401 // // проверяющий бухгалтер по всем расходам
6402 // accauntants = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 406");
6403 // if (accauntants.Count > 0) {
6404 // context.ResponsiblesBookkeepers.AddAll (accauntants.First ().ResponsibleUsers);
6405 // }
6406 // break;
6407 // }
6408 // Console.WriteLine ("5582");
6409 // // // для Авансов - проверяет Николаева О.
6410 // // if (context.ChargeGroup2.Name == "Аванс") {
6411 // // var uu102 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 809");
6412 // // // проверяющий авансы - Николаева О.
6413 // // if (uu102.Count > 0) {
6414 // // context.ResponsiblesBookkeepers.AddAll (uu102.First ().ResponsibleUsers);
6415 // // }
6416 // // }
6417 // // else
6418 // // if (context.ChargeGroup2.Name == "Аванс %") {
6419 // // var uu102 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 910");
6420 // // // проверяющий авансы % - Подолян Ю.
6421 // // if (uu102.Count > 0) {
6422 // // context.ResponsiblesBookkeepers.AddAll (uu102.First ().ResponsibleUsers);
6423 // // }
6424 // // }
6425 // // else// для остальных - проверяет Моторина В.
6426 // // {
6427 // // var uu102 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 406");
6428 // // // проверяющий бухгалтер по всем расходам
6429 // // if (uu102.Count > 0) {
6430 // // context.ResponsiblesBookkeepers.AddAll (uu102.First ().ResponsibleUsers);
6431 // // }
6432 // // }
6433 // /// **************** ДИРЕКТОР ***************************************************
6434 // //{ 104,"Директор" }
6435 // context.ResponsiblesGeneralDirector.Clear ();
6436 // // Директор 1: сначала директора ищем в справочнике Виды ответственности по совпадению отдела, за которые он отвечает
6437 // var uu104 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 408");
6438 // // 2) ищем все вышестоящие подразделения у выбранного отдела
6439 // List<OrganizationItem> parents = new List<OrganizationItem> ();
6440 // OrganizationItem unit = context.Unit;
6441 // while (unit.ParentItem != null) {
6442 // parents.Add (unit);
6443 // Console.WriteLine (unit.Name);
6444 // unit = unit.ParentItem;
6445 // }
6446 // // 3) сравниваем, если наш отдел содержится у согласующего, то добваляем в поле Согласующие
6447 // if (uu104.Count > 0) {
6448 // // находим все записи с типом "Согласующий директор" и пробегаем по каждой чтобы сравнить с искомым отделом
6449 // foreach (var sdir in uu104) {
6450 // foreach (var sdir_unit in sdir.Units) {
6451 // if (parents.Contains (sdir_unit)) {
6452 // context.ResponsiblesGeneralDirector.AddAll (sdir.ResponsibleUsers);
6453 // Console.WriteLine ("Директор - нашли по отделу ");
6454 // }
6455 // }
6456 // }
6457 // }
6458 // // Директор 2: если для заданного отдела не нашли директора, то берем из справочника Типы расходов
6459 // if (context.ResponsiblesGeneralDirector.Count == 0 && uu104.Count > 0) {
6460 // if (context.ChargeGroup2 != null && context.ChargeGroup2.DirectorZoneUsers.Count > 0) {
6461 // context.ResponsiblesGeneralDirector.AddAll (context.ChargeGroup2.DirectorZoneUsers);
6462 // Console.WriteLine ("Директор - берем из типов расходов - Воробьева");
6463 // }
6464 // }
6465 // // Директор 3: если же и в справочнике Типы расходов не указан директор, то находим директора по умолчанию из справочника Виды ответственности (т.е. у которого не указаны отделы)
6466 // if (context.ResponsiblesGeneralDirector.Count == 0 && uu104.Count > 0) {
6467 // foreach (var sdir in uu104) {
6468 // if (sdir.Units.Count == 0) {
6469 // context.ResponsiblesGeneralDirector.AddAll (sdir.ResponsibleUsers);
6470 // Console.WriteLine ("Директор - берем из видов ответственности для всех (финотдел)");
6471 // }
6472 // }
6473 // }
6474 // // Директор 4: если же ничего не нашли - то без директора (это возможно только в случае если спарвочник не заполнен)
6475 // /// ***************************************************************
6476 // // Бухгалтер по расчетам
6477 // context.Bookkeepers.Clear ();
6478 // var uu204 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 410");
6479 // if (uu204.Count > 0) {
6480 // context.Bookkeepers.AddAll (uu204.First ().ResponsibleUsers);
6481 // }
6482 // // Кассиры
6483 // context.Cashiers.Clear ();
6484 // var uu205 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 411");
6485 // if (uu205.Count > 0) {
6486 // context.Cashiers.AddAll (uu205.First ().ResponsibleUsers);
6487 // }
6488 // }
6489 //---------------------------------------------------------------------------------------------------------------------------------------------------
6490 /// <summary>
6491 /// CheckApproversFilledForWayApprovement
6492 /// </summary>
6493 /// <param name="context">Контекст процесса</param>
6494 /// <param name="form"></param>
6495 public virtual void CheckApproversFilledForWayApprovement(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6496 {
6497 // Проверка списков согласующих на замещения и подстановка заместителей
6498 stCheckUserListForReplacements(context, context.FilialCurators);
6499 stCheckUserListForReplacements(context, context.ManagersForApprovement);
6500 stCheckUserListForReplacements(context, context.ChargeTypeApprovementUsers);
6501 stCheckUserListForReplacements(context, context.ResponsiblesGeneralDirector);
6502 stCheckUserListForReplacements(context, context.ExecutorsForApprovement);
6503 // Ищем согласующих и проверяем условие
6504 // context.AllApproversAreFound = true;
6505 // // Проверяем, является ли инициатор менеджером по продажам - ищем среди вышестоящих подразделений "Группа продаж"
6506 // // 1) ищем все вышестоящие подразделения у инициатора (у его должности)
6507 // context.InitiatorIsManager = false;
6508 // // признак "является ли менеджером"
6509 // OrganizationItem unitd1 = context.Position;
6510 // // старт поиска начинаем с должности
6511 // while (unitd1.ParentItem != null && context.InitiatorIsManager == false) {
6512 // if (unitd1.Name == "Группа продаж") {
6513 // context.InitiatorIsManager = true;
6514 // }
6515 // unitd1 = unitd1.ParentItem;
6516 // }
6517 // if (context.Chief == null) {
6518 // context.AllApproversAreFound = false;
6519 // Console.WriteLine ("Не прошел условие 1");
6520 // }
6521 // if (context.FilialCurators.Count == 0 && context.Filial.Name != "Москва") {
6522 // context.AllApproversAreFound = false;
6523 // Console.WriteLine ("Не прошел условие 2");
6524 // }
6525 // // Нужно ли заполнять менеджеров или согласующих от исполнительного блока
6526 // // определяем список сотрудников, которым не требуется предв. согласование с менеджерами
6527 // var uu_nonman1 = EntityManager<ResponsibleForTaskList>.Instance.Find ("ResponsibilityType = 607");
6528 // List<User> nonmans1 = new List<User> ();
6529 // foreach (var uun in uu_nonman1) {
6530 // nonmans1.AddRange (uun.ResponsibleUsers.ToList ());
6531 // }
6532 // if (nonmans1.Contains (context.Initiator) == true && (context.ChargeGroup2.NameFull.ToLowerInvariant ().Contains ("субподряд")/*|| context.ChargeGroup2.NameFull.ToLowerInvariant ().Contains ("оборудовани")*/)) {
6533 // Console.WriteLine ("не нужно согласовывать ни с менеджерами ни с исп. блоком");
6534 // }
6535 // else {
6536 // if (context.ChargeType.Value == "На договор") {
6537 // if (context.InitiatorIsManager == false)// если инициатор не является менеджером
6538 // {
6539 // // Менеджеры
6540 // if (context.ManagersForApprovement.Count == 0 && context.ChargeGroup2.Name != "Оплата субподряда Отдел Сопровождение") {
6541 // context.AllApproversAreFound = false;
6542 // Console.WriteLine ("Не прошел условие 3");
6543 // }
6544 // }
6545 // else// если инициатор является менеджером
6546 // {
6547 // // Согласующие от исполнительного блока
6548 // if (context.ExecutorsForApprovement.Count == 0 && !(context.ChargeGroup2.Name == "Бензин" && context.SumItogoPayment < 2000 && context.SumItogoCash < 2000) && !(context.ChargeGroup2.Name == "Ретро" || context.ChargeGroup2.Name == "Билеты" || context.ChargeGroup2.Name == "Проживание")) {
6549 // context.AllApproversAreFound = false;
6550 // Console.WriteLine ("Не прошел условие 4");
6551 // }
6552 // }
6553 // }
6554 // else// Если за счет компании
6555 // {
6556 // }
6557 // }
6558 // // Бухгалтерия
6559 // if (context.ResponsiblesBookkeepers.Count == 0) {
6560 // context.AllApproversAreFound = false;
6561 // Console.WriteLine ("Не прошел условие 5");
6562 // }
6563 // // Бухгалтер по оплате счетов и кассир
6564 // switch (context.PaymentWay.Value) {
6565 // case "Наличный расчет":
6566 // // Кассир
6567 // if (context.Cashiers.Count == 0) {
6568 // context.AllApproversAreFound = false;
6569 // Console.WriteLine ("Не прошел условие 6");
6570 // }
6571 // break;
6572 // case "Безналичный расчет":
6573 // // Бухгалтер по оплате счетов
6574 // if (context.Bookkeepers.Count == 0) {
6575 // context.AllApproversAreFound = false;
6576 // Console.WriteLine ("Не прошел условие 7");
6577 // }
6578 // break;
6579 // case "Наличный+безналичный":
6580 // // Бухгалтер по оплате счетов
6581 // if (context.Bookkeepers.Count == 0) {
6582 // context.AllApproversAreFound = false;
6583 // Console.WriteLine ("Не прошел условие 8");
6584 // }
6585 // // Кассир
6586 // if (context.Cashiers.Count == 0) {
6587 // context.AllApproversAreFound = false;
6588 // Console.WriteLine ("Не прошел условие 9");
6589 // }
6590 // break;
6591 // }
6592 // Устанавливаем метку - все ли определены
6593 // if ((context.FilialCurators.Count == 0 && context.Filial.Name != "Москва") || (context.ManagersForApprovement.Count == 0 && context.ChargeType.Value == "На договор") || context.ChargeTypeApprovementUsers.Count == 0 || context.ChargeTypeApprovementUsers.Count == 0 || context.ResponsiblesBookkeepers.Count == 0 || context.ResponsiblesFinanceDepartment.Count == 0 || context.ResponsiblesBookkeeperChiefs.Count == 0 || context.ResponsiblesGeneralDirector.Count == 0 || context.Bookkeepers.Count == 0 || context.Cashiers.Count == 0) {
6594 // context.AllApproversAreFound = false;
6595 // }
6596 // *********************************************************
6597 // *********************************************************
6598 context.AllApproversAreFound = true;
6599 if (context.Chief != null)
6600 {
6601 form.For(c => c.Chief).Visible(false).Required(false);
6602 }
6603 if (context.FilialCurators.Count > 0 || context.Filial.Name == "Москва")
6604 {
6605 form.For(c => c.FilialCurators).Visible(false).Required(false);
6606 }
6607 // Нужно ли заполнять менеджеров или согласующих от исполнительного блока
6608 form.For(c => c.ManagersForApprovement).Visible(false).Required(false);
6609 form.For(c => c.ExecutorsForApprovement).Visible(false).Required(false);
6610 form.For(c => c.ChargeTypeApprovementUsers).Visible(false).Required(false);
6611 // определяем список сотрудников, которым не требуется предв. согласование с менеджерами
6612 var uu_nonman = EntityManager<ResponsibleForTaskList>.Instance.Find("ResponsibilityType = 607");
6613 List<User> nonmans = new List<User>();
6614 foreach (var uun in uu_nonman)
6615 {
6616 nonmans.AddRange(uun.ResponsibleUsers.ToList());
6617 }
6618 if (nonmans.Contains(context.Initiator) == true && (context.ChargeGroup2.NameFull.ToLowerInvariant().Contains("субподряд")/*|| context.ChargeGroup2.NameFull.ToLowerInvariant ().Contains ("оборудовани")*/))
6619 {
6620 Console.WriteLine("не нужно согласовывать ни с менеджерами ни с исп. блоком");
6621 }
6622 else
6623 {
6624 if (context.ChargeType.Value == "На договор")
6625 {
6626 if (context.InitiatorIsManager == false)// если инициатор не является менеджером
6627 {
6628 // Менеджеры
6629 if (context.ManagersForApprovement.Count == 0)
6630 {
6631 form.For(c => c.ManagersForApprovement).Visible(true).Required(false);
6632 context.AllApproversAreFound = false;
6633 }
6634 }
6635 else// если инициатор является менеджером
6636 {
6637 // Согласующие от исполнительного блока
6638 if (context.ExecutorsForApprovement.Count == 0 && !(context.ChargeGroup2.Name == "Бензин" && context.SumItogoPayment < 2000 && context.SumItogoCash < 2000))
6639 {
6640 form.For(c => c.ExecutorsForApprovement).Visible(true).Required(true);
6641 context.AllApproversAreFound = false;
6642 }
6643 else
6644 {
6645 //if (context.InitiatorIsManager == true) {
6646 // 1) ищем все вышестоящие подразделения у каждого указанного пользователя (у его должности)
6647 //bool AllApproversAreExecutors = true;
6648 // признак "все ли указанные являются ли исполнителями"
6649 foreach (var approver in context.ExecutorsForApprovement.ToList())
6650 {
6651 //bool isispblock = false;
6652 // Если Григорьев, то не проверяем
6653 if (approver.UserName == "PododnyayaA" || approver.UserName == "BozkurtI" || approver.UserName == "GrigorievAA" || approver.UserName == "FilatchevAP" || approver.UserName == "FilatchevPP" || approver.UserName == "ElnikovaEM" || approver.UserName == "VorobyovaK" || approver.UserName == "KrylovaUA" || approver.UserName == "ershov")
6654 {
6655 }
6656 else
6657 {
6658 Console.WriteLine("исполнитель - " + approver.FullName);
6659 List<string> parent_unit_names = new List<string>();
6660 //OrganizationItem unit = approver.OrganizationItems.FirstOrDefault();
6661 OrganizationItem unit = approver.OrganizationItems.ToArray().Union(approver.OrganizationGroups).FirstOrDefault();
6662 Console.WriteLine("первый отдел - " + unit.Name);
6663 while (unit.ParentItem != null)
6664 {
6665 Console.WriteLine(unit.Name);
6666 parent_unit_names.Add(unit.Name);
6667 unit = unit.ParentItem;
6668 }
6669 //if (isispblock == false)
6670 if (!parent_unit_names.Contains("Исполнительный блок") && !parent_unit_names.Contains("Лаборатория"))
6671 {
6672 //AllApproversAreExecutors = false;
6673 context.AllApproversAreFound = false;
6674 form.Notifier.Error("Ошибка: " + approver.FullName + ", указанный в поле \"Согласующий от отдела исполнителя\" не является сотрудником исполнительного блока.");
6675 //return false;
6676 }
6677 }
6678 }
6679 //}
6680 }
6681 }
6682 }
6683 else// Если за счет компании
6684 {
6685 }
6686 }
6687 // Бухгалтерия
6688 if (context.ResponsiblesBookkeepers.Count > 0)
6689 {
6690 form.For(c => c.ResponsiblesBookkeepers).Visible(false).Required(false);
6691 }
6692 // Бухгалтер по оплате счетов и кассир
6693 form.For(c => c.Bookkeepers).Visible(false).Required(false);
6694 form.For(c => c.Cashiers).Visible(false).Required(false);
6695 switch (context.PaymentWay.Value)
6696 {
6697 case "Наличный расчет":
6698 // Кассир
6699 if (context.Cashiers.Count == 0)
6700 {
6701 form.For(c => c.Cashiers).Visible(true).Required(true);
6702 context.AllApproversAreFound = false;
6703 }
6704 break;
6705 case "Безналичный расчет":
6706 // Бухгалтер по оплате счетов
6707 if (context.Bookkeepers.Count == 0)
6708 {
6709 form.For(c => c.Bookkeepers).Visible(true).Required(true);
6710 context.AllApproversAreFound = false;
6711 }
6712 break;
6713 case "Наличный+безналичный":
6714 // Бухгалтер по оплате счетов
6715 if (context.Bookkeepers.Count == 0)
6716 {
6717 form.For(c => c.Bookkeepers).Visible(true).Required(true);
6718 context.AllApproversAreFound = false;
6719 }
6720 // Кассир
6721 if (context.Cashiers.Count == 0)
6722 {
6723 form.For(c => c.Cashiers).Visible(true).Required(true);
6724 context.AllApproversAreFound = false;
6725 }
6726 break;
6727 }
6728 }
6729
6730 /// <summary>
6731 /// ClearBlockWayApprovement
6732 /// </summary>
6733 /// <param name="context">Контекст процесса</param>
6734 /// <param name="form"></param>
6735 public virtual void ClearBlockWayApprovement(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6736 {
6737 foreach (var row in context.WayApprovement.ToList())
6738 {
6739 context.WayApprovement.Remove(row);
6740 // row.Delete();
6741 }
6742 }
6743
6744 /// <summary>
6745 /// AfterChange_CRMNumbers
6746 /// </summary>
6747 /// <param name="context">Контекст процесса</param>
6748 /// <param name="form"></param>
6749 public virtual void AfterChange_CRMNumbers(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6750 {
6751 context.ManagersForApprovement.Clear();
6752 context.ExecutorsForApprovement.Clear();
6753 }
6754
6755 /// <summary>
6756 /// AfterChange_Filial
6757 /// </summary>
6758 /// <param name="context">Контекст процесса</param>
6759 /// <param name="form"></param>
6760 public virtual void AfterChange_Filial(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6761 {
6762 context.FilialCurators.Clear();
6763 }
6764
6765 /// <summary>
6766 /// SetDopApprovers
6767 /// </summary>
6768 /// <param name="context">Контекст процесса</param>
6769 public virtual void SetDopApprovers(Context context)
6770 {
6771 List<User> just_members = new List<User>();
6772 foreach (var row in context.WayApprovement)
6773 {
6774 just_members.AddRange(row.ApprovementUsers);
6775 }
6776 just_members.Add(context.Initiator);
6777 if (context.AdditionalApprovementUsers.Count > 0)
6778 {
6779 var ni = InterfaceActivator.Create<P_ClCash4Contractor_WayApprovement>();
6780 ni.Step = context.WayApprovement.Count + 1;
6781 ni.Stage = 3;
6782 //ni.AnyUser = true;
6783 ni.Comment = "Доп.согласующий, назначенный бухгалтером";
6784 // проверяем на дубли
6785 List<User> users = new List<User>();
6786 users.AddRange(context.AdditionalApprovementUsers);
6787 foreach (var usr in users.ToList())
6788 {
6789 if (just_members.Contains(usr) == true)
6790 {
6791 users.Remove(usr);
6792 }
6793 }
6794 ni.ApprovementUsers.AddAll(users);
6795 if (ni.ApprovementUsers.Count > 0)
6796 {
6797 context.WayApprovement.Add(ni);
6798 just_members.AddRange(ni.ApprovementUsers);
6799 }
6800 }
6801 }
6802
6803 /// <summary>
6804 /// CheckExitFromTask3
6805 /// </summary>
6806 /// <param name="context">Контекст процесса</param>
6807 /// <param name="form"></param>
6808 public virtual bool CheckExitFromTask3(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6809 {
6810 if (context.WayApprovement.Count > 0)
6811 {
6812 return true;
6813 }
6814 else
6815 {
6816 if (context.ChargeGroup.Name == "Расходы руководства")//при расходов руководства разрешаем без согласования
6817 {
6818 return true;
6819 }
6820 else
6821 {
6822 form.Notifier.Error("Запрещено отправлять на согласование с пустым маршрутом! Укажите в предложенных полях недостающих согласующих и нажмите 'Проверить еще раз'. После того, как заполнился маршрут согласования, сможете отправить на согласование.");
6823 return false;
6824 }
6825 }
6826 }
6827
6828 /// <summary>
6829 /// BookkeeperRejected
6830 /// </summary>
6831 /// <param name="context">Контекст процесса</param>
6832 public virtual void BookkeeperRejected(Context context)
6833 {
6834 string bfio = "";
6835 if (context.Bookkeeper != null)
6836 {
6837 bfio = context.Bookkeeper.FullName;
6838 }
6839 if (context.TaskUnconfirmedName.Contains("Оплата не согласована - принять решение"))
6840 {
6841 context.TaskUnconfirmedName = "Бухгалтер " + bfio + " отказал(а) в оплате";
6842 }
6843 else
6844 {
6845 context.TaskUnconfirmedName += " и Бухгалтер " + bfio + " отказал(а) в оплате";
6846 }
6847 context.BookkeeperRejected = true;
6848 }
6849
6850 /// <summary>
6851 /// CashierRejected
6852 /// </summary>
6853 /// <param name="context">Контекст процесса</param>
6854 public virtual void CashierRejected(Context context)
6855 {
6856 if (context.TaskUnconfirmedName.Contains("Оплата не согласована - принять решение"))
6857 {
6858 context.TaskUnconfirmedName = "Кассир " + context.Cashier.FullName + " отказал(а) в выплате";
6859 }
6860 else
6861 {
6862 context.TaskUnconfirmedName += " и Кассир " + context.Cashier.FullName + " отказал(а) в выплате";
6863 }
6864 context.BookkeeperRejected = true;
6865 }
6866
6867 /// <summary>
6868 /// BookeeperUnReject
6869 /// </summary>
6870 /// <param name="context">Контекст процесса</param>
6871 public virtual void BookeeperUnReject(Context context)
6872 {
6873 context.BookkeeperRejected = false;
6874 }
6875
6876 /// <summary>
6877 /// ClearBuhCashComment
6878 /// </summary>
6879 /// <param name="context">Контекст процесса</param>
6880 public virtual void ClearBuhCashComment(Context context)
6881 {
6882 context.TaskUnconfirmedName = "Оплата не согласована - принять решение";
6883 context.BookkeepersComment = "";
6884 context.CashierComment = "";
6885 }
6886
6887 /// <summary>
6888 /// CheckBookkeeperComment
6889 /// </summary>
6890 /// <param name="context">Контекст процесса</param>
6891 /// <param name="form"></param>
6892 public virtual bool CheckBookkeeperComment(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6893 {
6894 if (context.BookkeepersComment == "" || context.BookkeepersComment == null)
6895 {
6896 form.Notifier.Warning("При отказе в оплате нужно указать причину в комментарии!");
6897 return false;
6898 }
6899 return true;
6900 }
6901
6902 /// <summary>
6903 /// CheckCashComment
6904 /// </summary>
6905 /// <param name="context">Контекст процесса</param>
6906 /// <param name="form"></param>
6907 public virtual bool CheckCashComment(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6908 {
6909 if (context.CashierComment == "" || context.CashierComment == null)
6910 {
6911 form.Notifier.Warning("При отказе в выплате нужно указать причину в комментарии!");
6912 return false;
6913 }
6914 return true;
6915 }
6916
6917 /// <summary>
6918 /// FillRentInfo
6919 /// </summary>
6920 /// <param name="context">Контекст процесса</param>
6921 /// <param name="form"></param>
6922 public virtual void FillRentInfo(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
6923 {
6924 if (context.RentContract != null)
6925 {
6926 Dictionary<string, DropDownItem> moths = new Dictionary<string, DropDownItem> {
6927 {
6928 "январь",
6929 new DropDownItem ("", "февраль")
6930 },
6931 {
6932 "февраль",
6933 new DropDownItem ("", "март")
6934 },
6935 {
6936 "март",
6937 new DropDownItem ("", "апрель")
6938 },
6939 {
6940 "апрель",
6941 new DropDownItem ("", "май")
6942 },
6943 {
6944 "май",
6945 new DropDownItem ("", "июнь")
6946 },
6947 {
6948 "июнь",
6949 new DropDownItem ("", "июль")
6950 },
6951 {
6952 "июль",
6953 new DropDownItem ("", "август")
6954 },
6955 {
6956 "август",
6957 new DropDownItem ("", "сентябрь")
6958 },
6959 {
6960 "сентябрь",
6961 new DropDownItem ("", "октябрь")
6962 },
6963 {
6964 "октябрь",
6965 new DropDownItem ("", "ноябрь")
6966 },
6967 {
6968 "ноябрь",
6969 new DropDownItem ("", "декабрь")
6970 },
6971 {
6972 "декабрь",
6973 new DropDownItem ("", "январь")
6974 }
6975 };
6976 if (context.MonthPayment == null && context.RentContract.MonthPayment != null)
6977 {
6978 context.MonthPayment = moths[context.RentContract.MonthPayment.Value];
6979 }
6980 if (context.MonthPayment != null)
6981 {
6982 context.RentContract.MonthPayment = context.MonthPayment;
6983 }
6984 if (context.FileAccount == null || !context.FileAccount.Name.Contains("Аренда недвижимости.xlsx"))
6985 {
6986 var PathSystem = Locator.GetServiceNotNull<IRuntimeApplication>().Configuration.Config.FilePath.Replace("configuration.config", "");
6987 string fullpath = PathSystem + "Templates\\";
6988 string fileName = fullpath + "Аренда недвижимости.xlsx";
6989 Stream stream = new FileStream(fileName, FileMode.Create);
6990 var temp = BinaryFile.CreateContentFilePath(fileName);
6991 using (var fs = new FileStream(temp, FileMode.CreateNew, FileAccess.Write))
6992 {
6993 stream.Seek(0, SeekOrigin.Begin);
6994 stream.CopyTo(fs);
6995 }
6996 var mimeMappingService = Locator.GetServiceNotNull<IMimeMappingService>();
6997 var fileFL = new BinaryFile
6998 {
6999 ContentType = mimeMappingService.GetTypeByExtension(Path.GetExtension(fileName)),
7000 Name = Path.GetFileName(fileName),
7001 ContentFilePath = temp,
7002 CreateDate = DateTime.Now,
7003 };
7004 DataAccessManager.FileManager.SaveFile(fileFL);
7005 context.FileAccount = fileFL;
7006 }
7007 int row = 0;
7008 string filepath_excel = context.FileAccount.ContentFilePath;
7009 Workbook workbook = new Workbook(filepath_excel);
7010 workbook.Worksheets.Clear();
7011 workbook.Worksheets.Add();
7012 var worksheet = workbook.Worksheets[0];
7013 worksheet.Name = "Счёт";
7014 workbook.Save(filepath_excel);
7015 DataAccessManager.FileManager.SaveFile(context.FileAccount);
7016 Aspose.Cells.Cells cells = worksheet.Cells;
7017 cells.Clear();
7018 cells.SetColumnWidth(0, 42);
7019 cells.SetColumnWidth(1, 42);
7020 cells.SetColumnWidth(2, 16);
7021 cells.SetColumnWidth(3, 15);
7022 cells.SetColumnWidth(4, 13);
7023 cells.SetColumnWidth(5, 22);
7024 cells.SetColumnWidth(6, 19);
7025 cells.SetColumnWidth(7, 13);
7026 cells.SetColumnWidth(8, 16);
7027 InsertRowXLS_Level(cells, row, 8, 0);
7028 cells.Merge(row, 0, 2, 1);
7029 cells[row, 0].PutValue("Арендатор");
7030 cells.Merge(row, 1, 1, 2);
7031 cells[row, 1].PutValue("Арендодатель");
7032 cells.Merge(row, 3, 1, 3);
7033 cells[row, 3].PutValue("Договор аренды");
7034 cells.Merge(row, 6, 1, 2);
7035 cells[row, 6].PutValue("Ежемесячный платеж");
7036 cells.Merge(row, 8, 2, 1);
7037 cells[row, 8].PutValue("Месяц оплаты");
7038 row++;
7039 InsertRowXLS_Level(cells, row, 8, 0);
7040 cells[row, 1].PutValue("Наименование");
7041 cells[row, 2].PutValue("ИНН");
7042 cells[row, 3].PutValue("Дата");
7043 cells[row, 4].PutValue("Номер");
7044 cells[row, 5].PutValue("Срок действия");
7045 cells[row, 6].PutValue("Сумма");
7046 cells[row, 7].PutValue("НДС");
7047 row++;
7048 InsertRowXLS_Level(cells, row, 8, 1);
7049 if (context.RentContract.LandlordINN != null)
7050 {
7051 cells[row, 2].PutValue(context.RentContract.LandlordINN);
7052 }
7053 if (context.RentContract.LandlordName != null)
7054 {
7055 cells[row, 1].PutValue(context.RentContract.LandlordName);
7056 }
7057 if (context.RentContract.MonthPayment != null)
7058 {
7059 cells[row, 8].PutValue(context.RentContract.MonthPayment.Value);
7060 }
7061 if (context.RentContract.MonthlyPayment != null)
7062 {
7063 cells[row, 6].PutValue(context.RentContract.MonthlyPayment.ToString() + " Р");
7064 }
7065 if (context.RentContract.NDS != null)
7066 {
7067 cells[row, 7].PutValue(context.RentContract.NDS == true ? "с НДС" : "без НДС");
7068 }
7069 if (context.RentContract.RentDate.HasValue == true)
7070 {
7071 cells[row, 3].PutValue(context.RentContract.RentDate.Value.ToShortDateString());
7072 }
7073 if (context.RentContract.RentNumber != null)
7074 {
7075 cells[row, 4].PutValue(context.RentContract.RentNumber);
7076 }
7077 if (context.RentContract.RentTerm.HasValue == true)
7078 {
7079 cells[row, 5].PutValue(context.RentContract.RentTerm.Value.ToShortDateString());
7080 }
7081 if (context.RentContract.Renter != null)
7082 {
7083 cells[row, 0].PutValue(context.RentContract.Renter);
7084 }
7085 workbook.Save(filepath_excel);
7086 DataAccessManager.FileManager.SaveFile(context.FileAccount);
7087 }
7088 }
7089
7090 public void InsertRowXLS_Level(Aspose.Cells.Cells cells, int row, int col, int level)
7091 {
7092 var style = cells[row, 0].GetStyle();
7093 style.HorizontalAlignment = TextAlignmentType.Center;
7094 style.VerticalAlignment = TextAlignmentType.Center;
7095 style.Font.Name = "Times New Roman";
7096 style.IsTextWrapped = true;
7097 //style.Font.IsItalic = true;
7098 style.Pattern = BackgroundType.Solid;
7099 style.Font.Color = System.Drawing.Color.FromArgb(0, 0, 0);
7100 switch (level)
7101 {
7102 case 0:
7103 cells.SetRowHeight(row, 20);
7104 style.Font.Size = 16;
7105 style.ForegroundColor = System.Drawing.Color.FromArgb(153, 204, 153);
7106 style.Font.Color = System.Drawing.Color.FromArgb(0, 0, 0);
7107 style.Font.IsBold = true;
7108 break;
7109 default:
7110 cells.SetRowHeight(row, 16);
7111 style.Font.Size = 13;
7112 style.ForegroundColor = System.Drawing.Color.FromArgb(255, 255, 255);
7113 style.Font.Color = System.Drawing.Color.FromArgb(0, 0, 0);
7114 style.Font.IsBold = false;
7115 break;
7116 }
7117 for (int i = 0; i <= col; i++)
7118 {
7119 cells[row, i].SetStyle(style);
7120 }
7121 SetRowBorder(cells, row, col);
7122 }
7123
7124 public void SetRowBorder(Aspose.Cells.Cells cells, int row, int col)
7125 {
7126 var style = cells[row, 0].GetStyle();
7127 style.Borders[Aspose.Cells.BorderType.TopBorder].LineStyle = CellBorderType.Thin;
7128 style.Borders[Aspose.Cells.BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
7129 style.Borders[Aspose.Cells.BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
7130 style.Borders[Aspose.Cells.BorderType.RightBorder].LineStyle = CellBorderType.Thin;
7131 style.Borders[Aspose.Cells.BorderType.TopBorder].Color = System.Drawing.Color.FromArgb(128, 128, 128);
7132 style.Borders[Aspose.Cells.BorderType.BottomBorder].Color = System.Drawing.Color.FromArgb(128, 128, 128);
7133 style.Borders[Aspose.Cells.BorderType.LeftBorder].Color = System.Drawing.Color.FromArgb(128, 128, 128);
7134 style.Borders[Aspose.Cells.BorderType.RightBorder].Color = System.Drawing.Color.FromArgb(128, 128, 128);
7135 for (int i = 0; i <= col; i++)
7136 {
7137 cells[row, i].SetStyle(style);
7138 }
7139 }
7140
7141 /// <summary>
7142 /// AfterT3AdditionalApprovementFUChange
7143 /// </summary>
7144 /// <param name="context">Контекст процесса</param>
7145 /// <param name="form"></param>
7146 public virtual void AfterT3AdditionalApprovementFUChange(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
7147 {
7148 if (context.AdditionalApprovementUsersFInitiator.Count == 0)
7149 {
7150 return;
7151 }
7152 // List<User> aUsrs = new List<User>();
7153 // foreach(var row in context.WayApprovement)
7154 // {
7155 // aUsrs.AddRange(row.ApprovementUsers);
7156 // }
7157 // if(aUsrs.Contains(context.AdditionalApprovementUsersFInitiator.Last()))
7158 if (context.WayApprovement.Any(x => x.ApprovementUsers.Any(y => context.AdditionalApprovementUsersFInitiator.Contains(y))))
7159 {
7160 form.Notifier.Warning("Этот сотрудник уже есть в маршруте согласования!");
7161 context.AdditionalApprovementUsersFInitiator.Remove(context.AdditionalApprovementUsersFInitiator.Last());
7162 }
7163 if (context.AdditionalApprovementUsersFInitiator.Contains(context.Initiator))
7164 {
7165 form.Notifier.Warning("Нельзя добавить себя в маршрут согласования!");
7166 context.AdditionalApprovementUsersFInitiator.Remove(context.AdditionalApprovementUsersFInitiator.Last());
7167 }
7168 }
7169
7170 /// <summary>
7171 /// CheckAfterTask2
7172 /// </summary>
7173 /// <param name="context">Контекст процесса</param>
7174 /// <param name="form"></param>
7175 public virtual bool CheckAfterTask2(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
7176 {
7177 // Проверка: если "на договор", то в каждой ячейке расходов должна быть указан № сделки
7178 // номера сделок можно добавлять тольков шаге 1
7179 if (context.ChargeType.Value == "На договор")
7180 {
7181 //заполнены номера CRM
7182 if (String.IsNullOrWhiteSpace(context.NumbersInCRM))
7183 {
7184 form.Notifier.Error("В поле Номера сделок CRM не указаны номера сделок! Вернитесь на Шаг1 и укажите номера сделок!");
7185 return false;
7186 }
7187 //в каждой ячейке расходов должна быть указан № сделки и получена информация из CRM
7188 bool all_crm_filled = true;
7189 bool has_null_sum = false;
7190 foreach (var item in context.CostItems)
7191 {
7192 if (String.IsNullOrWhiteSpace(item.NumAppCRM))
7193 {
7194 all_crm_filled = false;
7195 }
7196 if (String.IsNullOrWhiteSpace(item.ContractNumber))
7197 {
7198 all_crm_filled = false;
7199 }
7200 switch (context.PaymentWay.Value)
7201 {
7202 case "Наличный расчет":
7203 if (item.SumCash == 0)
7204 {
7205 has_null_sum = true;
7206 }
7207 break;
7208 case "Безналичный расчет":
7209 if (item.SumPayment == 0)
7210 {
7211 has_null_sum = true;
7212 }
7213 break;
7214 case "Наличный+безналичный":
7215 if (item.SumPayment == 0 || item.SumCash == 0)
7216 {
7217 has_null_sum = true;
7218 }
7219 break;
7220 }
7221 }
7222 if (has_null_sum == true)
7223 {
7224 form.Notifier.Error("В таблице Расходы имеются записи с нулевой суммой расхода! Суммы должны быть распределены по всем указанным сделкам! Иначе вернитесь на Шаг1 и уберите ненужную сделку.");
7225 return false;
7226 }
7227 if (all_crm_filled == false)
7228 {
7229 form.Notifier.Error("В таблице Расходы имеются записи, в которых не указан номер сделки, либо не получена информация по сделке из CRM. Вернитесь на Шаг1, укажите номера сделок и снова перейдите на Шаг2. Менять номера сделок в таблице запрещено! Номера сделок указываются только на Шаге1!");
7230 return false;
7231 }
7232 // сумма расходов по сделкам должна быть равна сумме, указанной вручную
7233 switch (context.PaymentWay.Value)
7234 {
7235 case "Наличный расчет":
7236 if (context.SumItogoCash != context.SumCash)
7237 {
7238 form.Notifier.Error("Распределенная по сделкам сумма не равна указанной итоговой сумме!");
7239 return false;
7240 }
7241 break;
7242 case "Безналичный расчет":
7243 if (context.SumItogoPayment != context.SumPayment)
7244 {
7245 form.Notifier.Error("Распределенная по сделкам сумма не равна указанной итоговой сумме!");
7246 return false;
7247 }
7248 break;
7249 case "Наличный+безналичный":
7250 if (context.SumItogoPayment != context.SumPayment || context.SumItogoCash != context.SumCash)
7251 {
7252 form.Notifier.Error("Распределенная по сделкам сумма не равна указанной итоговой сумме!");
7253 return false;
7254 }
7255 break;
7256 }
7257 }
7258 foreach (var attachment in context.Attachments)
7259 {
7260 if (attachment.File != null && System.IO.File.Exists(attachment.File.ContentFilePath) && !validextensions_list.Contains(System.IO.Path.GetExtension(attachment.File.ContentFilePath)))
7261 {
7262 form.Notifier.Error("В поле Приложения к договору вложен файл недопустимого формата! Разрешены только файлы Word, Excel, PDF и изображения.");
7263 return false;
7264 }
7265 }
7266 if (context.ContractDocument != null && context.ContractDocument.File != null && System.IO.File.Exists(context.ContractDocument.File.ContentFilePath) && !validextensions_list.Contains(System.IO.Path.GetExtension(context.ContractDocument.File.ContentFilePath)))
7267 {
7268 form.Notifier.Error("В поле Договор вложен файл недопустимого формата! Разрешены только файлы Word, Excel, PDF и изображения.");
7269 return false;
7270 }
7271 if (context.SumItogoCash <= 0 && context.SumItogoPayment <= 0)//при расходов руководства разрешаем без согласования
7272 {
7273 form.Notifier.Error("Должна быть указана хотя бы одна сумма ИТОГО НАЛИЧНЫЕ или ИТОГО БЕЗНАЛ!");
7274 return false;
7275 }
7276 return true;
7277 }
7278
7279 /// <summary>
7280 /// DatePaymentPlannedChange
7281 /// </summary>
7282 /// <param name="context">Контекст процесса</param>
7283 public virtual void DatePaymentPlannedChange(Context context)
7284 {
7285 if (context.DatePaymentPlanned.HasValue == true)
7286 {
7287 context.DatePaymentPlanned = context.DatePaymentPlanned.Value.AddMonths(1);
7288 //context.DateBuhTaskFinish = context.DatePaymentPlanned.Value.AddDays(-1);
7289 }
7290 }
7291
7292 /// <summary>
7293 /// CheckContractorIn1C_KBK
7294 /// </summary>
7295 /// <param name="context">Контекст процесса</param>
7296 /// <param name="form"></param>
7297 public virtual void CheckContractorIn1C_KBK(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
7298 {
7299 var groupbuh = PublicAPI.Portal.Security.UserGroup.LoadOrNull(8384);
7300 if (groupbuh.Users.Contains(PublicAPI.Portal.Security.User.GetCurrentUser()))
7301 {
7302 // очищаем блок с найденными контрагентами
7303 foreach (var item in context.Contractors1C.ToList())
7304 {
7305 item.Delete();
7306 context.Contractors1C.Remove(item);
7307 }
7308 foreach (var item in context.KBK1C.ToList())
7309 {
7310 item.Delete();
7311 context.KBK1C.Remove(item);
7312 }
7313 string errhtml = "";
7314 context.ErrorMessageCheckContractor1C = new MvcHtmlString(errhtml);
7315 bool is_correct = true;
7316 if (String.IsNullOrWhiteSpace(context.ContractorINN) || (context.ContractorINN.Length != 10 && context.ContractorINN.Length != 12))
7317 {
7318 //form.Notifier.Error ("Неверная длина ИНН контрагента!");
7319 errhtml += @"<p class=""red"">Неверная длина ИНН контрагента!</p>";
7320 is_correct = false;
7321 }
7322 if (String.IsNullOrWhiteSpace(context.ContractorAccount) || context.ContractorAccount.Length != 20)
7323 {
7324 //form.Notifier.Error ("Неверная длина расчетного счета!");
7325 errhtml += @"<p class=""red"">Неверная длина расчетного счета!</p>";
7326 is_correct = false;
7327 }
7328 /*if (String.IsNullOrWhiteSpace(context.ContractorBankCorracc) && context.ContractorBankCorracc.Length != 20) {
7329 form.Notifier.Error ("Неверная длина коррсчета!");
7330 is_correct = false;
7331 }*/
7332 if (String.IsNullOrWhiteSpace(context.INNOurCompany) || (context.INNOurCompany.Length != 10 && context.INNOurCompany.Length != 12))
7333 {
7334 //form.Notifier.Error ("Неверная длина ИНН нашей компании!");
7335 errhtml += @"<p class=""red"">Неверная длина ИНН нашей компании!</p>";
7336 is_correct = false;
7337 }
7338 if (is_correct == true)
7339 {
7340 context.LogIntegration1C = "";
7341 context.LogIntegration1C += "********************************************** \n " + DateTime.Now.ToString() + "\n Запуск проверки контрагента";
7342 //context.INNOurCompany = "5048048560";
7343 string OurINN = "";
7344 //"5048048560";
7345 try
7346 {
7347 if (!String.IsNullOrWhiteSpace(context.INNOurCompany))
7348 {
7349 OurINN = context.INNOurCompany;
7350 //OurINN = "2903010500";
7351 //context.ContractorINN = "7713640704";
7352 //context.ContractorName = "";
7353 //context.ContractorAccountBankBIC = "042748634";
7354 //context.ContractorAccountNumber = "30301810222000060201";
7355 //var t= Integration1С.FindCounterparty1C("5048048561","7713640704","042748634","30301810222000060201");
7356 string res_namebank = "";
7357 string res_context = "";
7358 string res_status = "";
7359 bool all_values = false;
7360 // ОБЯЗАТЕЛЬНО ПРОВЕРЯЕМ НА ЗАПОЛНЕННОСТЬ - ВСЕ ПЕРЕМЕННЫЕ ДОЛЖНЫ БЫТЬ ЗАПОЛНЕНЫ !!!!
7361 if (!String.IsNullOrWhiteSpace(OurINN) && !String.IsNullOrWhiteSpace(context.ContractorINN) && !String.IsNullOrWhiteSpace(context.ContractorBankBIK) && !String.IsNullOrWhiteSpace(context.ContractorAccount))
7362 {
7363 all_values = true;
7364 }
7365 // добавить проверки на формат ИНН, счета, БИК
7366 if (all_values == true)
7367 {
7368 context.LogIntegration1C += "\n Проверяем контрагента";
7369 bool GetKBK = true;
7370 JsonResult2 answer = Lib1C_CheckContractor_KBK(OurINN, context.ContractorINN, context.ContractorBankBIK, context.ContractorAccount, GetKBK, out res_context, out res_status);
7371 //Console.WriteLine("01");
7372 //Console.WriteLine ("res_namebank=" + res_namebank);
7373 //Console.WriteLine ("res_context=" + res_context);
7374 //Console.WriteLine ("res_status=" + res_status);
7375 context.LogIntegration1C += "\n res_context=" + res_context;
7376 context.LogIntegration1C += "\n res_status=" + res_status;
7377 //Console.WriteLine("res_context=" + res_context);
7378 //Console.WriteLine("res_status=" + res_status);
7379 //Console.WriteLine("answer.error=" + answer.error);
7380 //Console.WriteLine("02");
7381 //Console.WriteLine("03");
7382 if (answer.error == "")
7383 {
7384 Console.WriteLine("нет ошибки в answer.error");
7385 context.LogIntegration1C += "\n namebank=" + answer.namebank;
7386 context.LogIntegration1C += "\n bank bic=" + answer.bic;
7387 context.LogIntegration1C += "\n bank corracc=" + answer.corracc;
7388 context.ContractorBankName = answer.namebank.Replace("$", "'");
7389 context.ContractorBankCorracc = answer.corracc;
7390 Console.WriteLine("\n KBK=" + answer.ArrayListCBC.ToSeparatedString("|"));
7391 foreach (var cbc in answer.ArrayListCBC)
7392 {
7393 context.LogIntegration1C += "\n KBK=" + cbc.cbc + "|" + cbc.okato + "|" + cbc.purpose;
7394 var ni = InterfaceActivator.Create<P_ClCash4Contractor_KBK1C>();
7395 ni.KBK = cbc.cbc;
7396 ni.OKTMO = cbc.okato;
7397 ni.Purpose = cbc.purpose;
7398 // Рисуем HTML с найденными контрагентами
7399 // string hstr = @"<table class='tt_contractor' cellpadding='0' cellspacing='0'>";
7400 // hstr += @"<tr class='tt_header'><td class='tt_c_name'>Код:</td><td>" + cc.code + @"</td></tr>";
7401 // hstr += @"<tr class='" + ReturnClassTTTr (cc.namecontr.ToLower (), context.ContractorName.ToLower ()) + "'><td class='tt_c_name'>Наименование:</td><td>" + cc.namecontr.Replace ("$", "'") + @"</td></tr>";
7402 // hstr += @"<tr class='" + ReturnClassTTTr (cc.inn, context.ContractorINN) + "'><td class='tt_c_name'>ИНН</td><td>" + cc.inn + @"</td></tr>";
7403 // hstr += @"<tr class='" + ReturnClassTTTr (cc.kpp, context.ContractorKPP) + "'><td class='tt_c_name'>КПП</td><td>" + cc.kpp + @"</td></tr>";
7404 // if (!String.IsNullOrWhiteSpace (cc.accountnumber)) {
7405 // hstr += @"<tr class='" + ReturnClassTTTr (cc.accountnumber, context.ContractorAccount) + "'><td class='tt_c_name'>Р/с</td><td>" + cc.accountnumber + @"</td></tr>";
7406 // hstr += @"<tr class='" + ReturnClassTTTr (cc.bic, context.ContractorBankBIK) + "'><td class='tt_c_name'>Банк</td><td>" + cc.bic + ",<br>" + cc.namebank.Replace ("$", "'") + ",<br>" + cc.coracc + @"</td></tr>";
7407 // }
7408 // hstr += @"</table>";
7409 // ni.HTML = new MvcHtmlString (hstr);
7410 context.KBK1C.Add(ni);
7411 }
7412 if (answer.accounts.Count > 0)
7413 {
7414 context.LogIntegration1C += "\n Найдено в 1С контрагентов :" + answer.accounts.Count.ToString();
7415 foreach (var cc in answer.accounts)
7416 {
7417 context.LogIntegration1C += "\n ****************************************";
7418 context.LogIntegration1C += "\n code=" + cc.code;
7419 context.LogIntegration1C += "\n namecontr=" + cc.namecontr;
7420 context.LogIntegration1C += "\n inn=" + cc.inn;
7421 context.LogIntegration1C += "\n kpp=" + cc.kpp;
7422 context.LogIntegration1C += "\n accountnumber=" + cc.accountnumber;
7423 context.LogIntegration1C += "\n bic=" + cc.bic;
7424 context.LogIntegration1C += "\n namebank=" + cc.namebank.Replace("$", "'");
7425 context.LogIntegration1C += "\n bank coracc=" + cc.coracc;
7426 var ni = InterfaceActivator.Create<P_ClCash4Contractor_Contractors1C>();
7427 ni.Name = cc.namecontr.Replace("$", "'");
7428 ni.INN = cc.inn;
7429 ni.KPP = cc.kpp;
7430 ni.AccountNumber = cc.accountnumber;
7431 ni.BIC = cc.bic;
7432 ni.BankName = cc.namebank.Replace("$", "'");
7433 ni.Code1C = cc.code;
7434 ni.Uid1C = cc.uid;
7435 ni.Resource = "1С";
7436 ni.CorrAcc = cc.coracc;
7437 //string hstr = @"Код:" + cc.code + "<br>Наименование:" + cc.namecontr + "<br> ИНН:" + cc.inn + "<br> КПП:" + cc.kpp + "<br>Р/счет:" + cc.accountnumber + "<br> БИК:" + cc.bic + "<br>Банк:" + cc.namebank + "<br>Корр.сч.:" + cc.coracc;
7438 // Рисуем HTML с найденными контрагентами
7439 string hstr = @"<table class='tt_contractor' cellpadding='0' cellspacing='0'>";
7440 hstr += @"<tr class='tt_header'><td class='tt_c_name'>Код:</td><td>" + cc.code + @"</td></tr>";
7441 hstr += @"<tr class='" + ReturnClassTTTr(cc.namecontr.ToLower(), context.ContractorName.ToLower()) + "'><td class='tt_c_name'>Наименование:</td><td>" + cc.namecontr.Replace("$", "'") + @"</td></tr>";
7442 hstr += @"<tr class='" + ReturnClassTTTr(cc.inn, context.ContractorINN) + "'><td class='tt_c_name'>ИНН</td><td>" + cc.inn + @"</td></tr>";
7443 hstr += @"<tr class='" + ReturnClassTTTr(cc.kpp, context.ContractorKPP) + "'><td class='tt_c_name'>КПП</td><td>" + cc.kpp + @"</td></tr>";
7444 if (!String.IsNullOrWhiteSpace(cc.accountnumber))
7445 {
7446 hstr += @"<tr class='" + ReturnClassTTTr(cc.accountnumber, context.ContractorAccount) + "'><td class='tt_c_name'>Р/с</td><td>" + cc.accountnumber + @"</td></tr>";
7447 hstr += @"<tr class='" + ReturnClassTTTr(cc.bic, context.ContractorBankBIK) + "'><td class='tt_c_name'>Банк</td><td>" + cc.bic + ",<br>" + cc.namebank.Replace("$", "'") + ",<br>" + cc.coracc + @"</td></tr>";
7448 }
7449 hstr += @"</table>";
7450 ni.ContractorHTML = new MvcHtmlString(hstr);
7451 context.Contractors1C.Add(ni);
7452 }
7453 }
7454 }
7455 else
7456 {
7457 Console.WriteLine("answer.error=" + answer.error);
7458 errhtml += @"<p class=""red"">" + answer.error + @"</p>";
7459 }
7460 }
7461 else
7462 {
7463 //form.Notifier.Error("Не заполнен один из реквизитов: Наш ИНН, ИНН, БИК, Номер счета");
7464 errhtml += @"<p class=""red"">Не заполнен один из реквизитов: Наш ИНН, ИНН, БИК, Номер счета!</p>";
7465 }
7466 }
7467 else
7468 {
7469 //form.Notifier.Error("Не указан ИНН нашей организации!");
7470 errhtml += @"<p class=""red"">Не указан ИНН нашей организации!</p>";
7471 context.LogIntegration1C += "\n Не указан ИНН нашей организации!";
7472 }
7473 }
7474 catch
7475 {
7476 }
7477 context.LogIntegration1C += "\n Проверка контрагента завершена";
7478 }
7479 else
7480 {
7481 context.LogIntegration1C += "\n Неверные реквизиты контрагента";
7482 }
7483 context.ErrorMessageCheckContractor1C = new MvcHtmlString(errhtml);
7484 }
7485 else
7486 {
7487 form.Notifier.Warning("Вы не имеете полномочий для работы с платежными поручениями! Обратитесь к администратору ELMA чтобы включили вас в группу 'Счета на оплату - Доступ к интеграции с 1С'");
7488 }
7489 }
7490
7491 /// <summary>
7492 /// SelectKBKFromList
7493 /// </summary>
7494 /// <param name="context">Контекст процесса</param>
7495 /// <param name="form"></param>
7496 public virtual void SelectKBKFromList(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
7497 {
7498 int countSelected = 0;
7499 foreach (var cc in context.KBK1C)
7500 {
7501 if (cc.Sel == true || context.KBK1C.Count == 1)
7502 {
7503 countSelected += 1;
7504 }
7505 }
7506 if (countSelected == 0)
7507 {
7508 form.Notifier.Warning("Вы не выбрали ни одного КБК");
7509 }
7510 else
7511 if (countSelected > 1)
7512 {
7513 form.Notifier.Warning("Вы выбрали больше одного КБК. Можно выбрать только один.");
7514 }
7515 else
7516 {
7517 foreach (var cc in context.KBK1C)
7518 {
7519 if (cc.Sel == true || context.KBK1C.Count == 1)
7520 {
7521 context.KBK = cc.KBK;
7522 context.OKTMO = cc.OKTMO;
7523 context.AccountPurpose = cc.Purpose;
7524 }
7525 }
7526 }
7527 }
7528
7529 /// <summary>
7530 /// SelectKBKFromList
7531 /// </summary>
7532 /// <param name="context">Контекст процесса</param>
7533 /// <param name="form"></param>
7534 public virtual void SelectKBKFromList_1(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
7535 {
7536 int countSelected = 0;
7537 foreach (var cc in context.KBK1C)
7538 {
7539 if (cc.Sel == true || context.KBK1C.Count == 1)
7540 {
7541 countSelected += 1;
7542 }
7543 }
7544 if (countSelected == 0)
7545 {
7546 form.Notifier.Warning("Вы не выбрали ни одного КБК");
7547 }
7548 else
7549 if (countSelected > 1)
7550 {
7551 form.Notifier.Warning("Вы выбрали больше одного КБК. Можно выбрать только один.");
7552 }
7553 else
7554 {
7555 foreach (var cc in context.KBK1C)
7556 {
7557 if (cc.Sel == true || context.KBK1C.Count == 1)
7558 {
7559 context.KBK = cc.KBK;
7560 context.OKTMO = cc.OKTMO;
7561 }
7562 }
7563 }
7564 }
7565 public class elementsum
7566 {
7567 public string Zavka;
7568 public string Name;
7569 public double? beznal;
7570 public double? nal;
7571 public string fizid;
7572
7573 public elementsum(string zavka, string name, double beznal, double nal, string fizid)
7574 {
7575 Zavka = zavka;
7576 Name = name;
7577 this.beznal = beznal;
7578 this.nal = nal;
7579 this.fizid = fizid;
7580 }
7581 }
7582
7583
7584 /// <summary>
7585 /// SendPaymentTo1C_KBK
7586 /// </summary>
7587 /// <param name="context">Контекст процесса</param>
7588 /// <param name="form"></param>
7589 public virtual void SendPaymentTo1C_KBK(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
7590 {
7591
7592
7593 if (context.FilePP == null)
7594 {
7595 var groupbuh = PublicAPI.Portal.Security.UserGroup.LoadOrNull(8384);
7596 if (groupbuh.Users.Contains(PublicAPI.Portal.Security.User.GetCurrentUser()))
7597 {
7598 bool is_correct = true;
7599 if (String.IsNullOrWhiteSpace(context.ContractorINN) || context.ContractorINN.Length != 10 && context.ContractorINN.Length != 12)
7600 {
7601 form.Notifier.Error("Неверная длина ИНН контрагента!");
7602 is_correct = false;
7603 }
7604 if (String.IsNullOrWhiteSpace(context.ContractorAccount) || context.ContractorAccount.Length != 20)
7605 {
7606 form.Notifier.Error("Неверная длина расчетного счета!");
7607 is_correct = false;
7608 }
7609 /*if (String.IsNullOrWhiteSpace (context.ContractorBankCorracc) || context.ContractorBankCorracc.Length != 20) {
7610 form.Notifier.Error ("Неверная длина коррсчета!");
7611 is_correct = false;
7612 }*/
7613 if (String.IsNullOrWhiteSpace(context.INNOurCompany) || context.INNOurCompany.Length != 10 && context.INNOurCompany.Length != 12)
7614 {
7615 form.Notifier.Error("Неверная длина ИНН нашей компании!");
7616 is_correct = false;
7617 }
7618 if (is_correct == true)
7619 {
7620 context.LogIntegration1C = "";
7621 context.LogIntegration1C += "********************************************** \n " + DateTime.Now.ToString() + "\n Запуск создания счета";
7622 string OurINN = "";
7623 //"5048048560";
7624 if (!String.IsNullOrWhiteSpace(context.INNOurCompany))
7625 {
7626 OurINN = context.INNOurCompany;
7627 // context.INNOurCompany;
7628 string ContractorName = context.ContractorName != null ? context.ContractorName.Replace("«", "\"").Replace("»", "\"").Replace("“", "\"").Replace("”", "\"") : null;
7629 string INN = context.ContractorINN;
7630 string KPP = context.ContractorKPP;
7631 string AccountNumber = context.ContractorAccount;
7632 string BIC = context.ContractorBankBIK;
7633 string Code = context.ContractorCode1C;
7634 string Uid1C = context.ContractorUid1C;
7635 double Sum = context.SumItogoPayment;
7636 string Currency = context.PaymentCurrency.CodeISONumerical.ToString();
7637 bool NDS = context.HasNDS;
7638 string Purpose = context.AccountPurpose;
7639 string Date = context.DatePaymentDoc.Value.ToString("yyyyMMdd000000");
7640 //DateTime.Today.ToString ("yyyyMMdd000000");
7641 string Loginuser = PublicAPI.Portal.Security.User.GetCurrentUser().UserName;
7642 string Responsible = null;
7643 bool Procuration = false;
7644 string processID = context.WorkflowInstance.Id.ToString();
7645 string req_context = "";
7646 string req_status = "";
7647 PPResult pp = new PPResult("", "", "null");
7648 bool all_values = true;
7649 // ОБЯЗАТЕЛЬНО ПРОВЕРЯЕМ НА ЗАПОЛНЕННОСТЬ - ВСЕ ПЕРЕМЕННЫЕ ДОЛЖНЫ БЫТЬ ЗАПОЛНЕНЫ !!!!
7650 if (String.IsNullOrWhiteSpace(OurINN))
7651 {
7652 form.Notifier.Error("Не указан ИНН нашей компании!");
7653 all_values = false;
7654 }
7655 if (String.IsNullOrWhiteSpace(ContractorName))
7656 {
7657 form.Notifier.Error("Не указано название контрагента!");
7658 all_values = false;
7659 }
7660 if (String.IsNullOrWhiteSpace(INN) || (INN.Length != 10 && INN.Length != 12))
7661 {
7662 form.Notifier.Error("Неверно указан ИНН контрагента (пустой либо длина не 10 и не 12)!");
7663 all_values = false;
7664 }
7665 if (String.IsNullOrWhiteSpace(KPP) && INN.Length == 10)
7666 {
7667 form.Notifier.Error("Не указан КПП контрагента!");
7668 all_values = false;
7669 }
7670 if (String.IsNullOrWhiteSpace(AccountNumber))
7671 {
7672 form.Notifier.Error("Не указан номер р/сч!");
7673 all_values = false;
7674 }
7675 if (String.IsNullOrWhiteSpace(BIC))
7676 {
7677 form.Notifier.Error("Не указан БИК!");
7678 all_values = false;
7679 }
7680 if (Sum <= 0)
7681 {
7682 form.Notifier.Error("Не указана сумма!");
7683 all_values = false;
7684 }
7685 if (String.IsNullOrWhiteSpace(Currency))
7686 {
7687 form.Notifier.Error("Не указана валюта!");
7688 all_values = false;
7689 }
7690 if (String.IsNullOrWhiteSpace(Purpose))
7691 {
7692 form.Notifier.Error("Не указано назначение платежа!");
7693 all_values = false;
7694 }
7695 if (String.IsNullOrWhiteSpace(Date))
7696 {
7697 form.Notifier.Error("Не указана дата ПП!");
7698 all_values = false;
7699 }
7700 // добавить проверки на формат ИНН, счета, БИК
7701 if (all_values == true)
7702 {
7703 context.LogIntegration1C += "\n Запускаем создание ПП";
7704 // try {
7705
7706 //Бушев начало
7707 List<elementsum> listtrat = new List<elementsum>();
7708 foreach (var item in context.CostItems)
7709 {
7710 listtrat.Add(new elementsum(item.NumAppCRM, item.ContractorName, item.SumPayment, item.SumCash, item.EmployeeWhomPay.CodeIndividual));
7711 }
7712 string tablestring = JsonConvert.SerializeObject(listtrat);
7713 // pp = Lib1C_CreatePPDoc (OurINN, INN, BIC, KPP, AccountNumber, ContractorName, Code, Sum, Purpose, NDS, Date, Currency, Loginuser, Responsible, Procuration, processID, out req_context, out req_status);
7714 PPResult result = new PPResult("", "", "");
7715 //(c)Бушев 1с
7716
7717 // var CreateRequest = new PPrequest_KBK(OurINN, Code, ContractorName, INN, KPP, AccountNumber, BIC, Sum, Currency, NDS, Purpose, Date, Loginuser, Responsible, Procuration, processID, Uid1C, context.KBK, context.OKTMO,
7718 // context.PaymentWay.Value, context.Unit.CodeDepartmentZUP, context.Filial.Name, context.ChargeGroup2.Name, context.ChargeGroup.Name,
7719 // context.DatePaymentPlanned.Value.ToString(), context.ChargeType.Value, context.NumbersInCRM.ToString(), context.SumCash.Value.ToString(), context.SumPayment.Value.ToString(), listtrat);
7720 // Бушев конец
7721
7722 // var CreateRequest = new PPrequest_KBK(OurINN, Code, ContractorName, INN, KPP, AccountNumber, BIC, Sum, Currency, NDS, Purpose, Date, Loginuser, Responsible, Procuration, processID, Uid1C, context.KBK, context.OKTMO,
7723 // context.PaymentWay.Value, context.Unit.CodeDepartmentZUP, context.Filial.Name, context.ChargeGroup2.Name, context.ChargeGroup.Name,
7724 // context.DatePaymentPlanned.Value.ToString(), context.ChargeType.Value, context.NumbersInCRM.ToString(), context.SumCash.Value.ToString(), context.SumPayment.Value.ToString());
7725
7726 //, context.Employee.UserName);//, context.FileAccountPDF.Name);
7727
7728 var CreateRequest = new PPrequest_KBK(OurINN, Code, ContractorName, INN, KPP, AccountNumber, BIC, Sum, Currency, NDS, Purpose, Date, Loginuser, Responsible, Procuration, processID, Uid1C, context.KBK, context.OKTMO,
7729 context.PaymentWay.Value, context.Unit.CodeDepartmentZUP, context.Filial.Name, context.ChargeGroup2.Name, context.ChargeGroup.Name,
7730 context.DatePaymentPlanned.Value.ToString(), context.ChargeType.Value, context.NumbersInCRM.ToString(), context.SumCash.Value.ToString(), context.SumPayment.Value.ToString(), tablestring.ToString());
7731 ////(с)Бушев 1с
7732 var client = new RestClient("http://vs83aps.sercons.local/");
7733 client.Authenticator = new HttpBasicAuthenticator("ElmaDok", "ElmaDok");
7734 var request = new RestRequest("erp_test/hs/documentselma/sluzebnzapiska/" + OurINN + "/" + processID, Method.POST);
7735 request.RequestFormat = DataFormat.Json;
7736 var json = JsonConvert.SerializeObject(CreateRequest);
7737 context.LogIntegration1C += "\n JSON, который отправляем в 1С: \n " + json;
7738 Console.WriteLine(json);
7739 var s = HttpUtility.UrlEncode(json);
7740 request.AddParameter("application/json", s, RestSharp.ParameterType.RequestBody);
7741 var queryResult = client.Execute(request);
7742 var statusCode = (int)queryResult.StatusCode;
7743 req_context = HttpUtility.UrlDecode(queryResult.Content);
7744 req_status = queryResult.StatusCode.ToString();
7745 Console.WriteLine(queryResult.Content);
7746 context.LogIntegration1C += "\n req_context=" + req_context;
7747 context.LogIntegration1C += "\n req_status=" + req_status;
7748 context.LogIntegration1C += "\n получили из 1С: \n " + queryResult.Content;
7749 try
7750 {
7751 result = JsonConvert.DeserializeObject<PPResult>(HttpUtility.UrlDecode(queryResult.Content));
7752 }
7753 catch
7754 {
7755 result.result = "\n не смогли распарсить json из 1с";
7756 }
7757 pp = result;
7758 context.SysLog += "\n ОК : Lib1C_CreatePPDoc выполнен";
7759 Console.WriteLine("req_context=" + req_context);
7760 Console.WriteLine("req_status=" + req_status);
7761 context.LogIntegration1C += "\n 1C вернула ";
7762 context.LogIntegration1C += "\n pp.link = " + pp.link;
7763 context.LogIntegration1C += "\n pp.file = " + pp.file;
7764 context.LogIntegration1C += "\n pp.result = " + pp.result;
7765 if (System.IO.File.Exists(pp.file))
7766 {
7767 context.URLToPPDocIn1C = new Uri(pp.link);
7768 Console.WriteLine("Файл найден, пытаемся загрузить ");
7769 context.FilePP = InterfaceActivator.Create<BinaryFile>();
7770 context.FilePP.Name = "ПП.pdf";
7771 context.FilePP.CreateDate = DateTime.Now;
7772 context.FilePP.InitializeContentFilePath();
7773 System.IO.File.Copy(pp.file, context.FilePP.ContentFilePath, true);
7774 PublicAPI.Services.File.SaveFile(context.FilePP);
7775 }
7776 else
7777 {
7778 Console.WriteLine("Файл не найден ((");
7779 }
7780 }
7781 else
7782 {
7783 form.Notifier.Error("Не заполнен один из реквизитов");
7784 }
7785 }
7786 else
7787 {
7788 form.Notifier.Error("Не указан ИНН нашей организации!");
7789 context.LogIntegration1C += "\n Не указан ИНН нашей организации!";
7790 }
7791 context.LogIntegration1C += "\n Закончили создание ПП";
7792 }
7793 else
7794 {
7795 context.LogIntegration1C += "\n Неверные реквизиты контрагента";
7796 }
7797 }
7798 else
7799 {
7800 form.Notifier.Warning("Вы не имеете полномочий для работы с платежными поручениями! Обратитесь к администратору ELMA чтобы включили вас в группу 'Счета на оплату - Доступ к интеграции с 1С'");
7801 }
7802 }
7803 else
7804 {
7805 form.Notifier.Warning("ПП уже создана в 1С! повторное создание запрещено!");
7806 }
7807 Logger.Log.Error("Ошибка выполнения сценария");
7808 }
7809
7810 /// <summary>
7811 /// CalcRETRO
7812 /// </summary>
7813 /// <param name="context">Контекст процесса</param>
7814 /// <param name="form"></param>
7815 public virtual void CalcRETRO(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
7816 {
7817 // ищем наличие других активных либо завершенных процессов согласования с типом расхода "РЕТРО", в которых присутствует указанная сделка CRM.
7818 // Если обнаружены - выдаем ошибку "По данной сделке CRM уже имеются запущенные или завершенные процессы!" и не пускаем дальше.
7819 context.SumCalcRETROComment = "";
7820 // Проверка на кол-во указанных CRM
7821 List<string> CRM_ContractNumbers = new List<string>();
7822 List<string> CRM_PrilNumbers = new List<string>();
7823 bool retro_has_errors = false;
7824 foreach (var item in context.CostItems)
7825 {
7826 if (!CRM_ContractNumbers.Contains(item.ContractNumber))
7827 {
7828 CRM_ContractNumbers.Add(item.ContractNumber);
7829 }
7830 if (!CRM_PrilNumbers.Contains(item.ContractAppendixPosition))
7831 {
7832 CRM_PrilNumbers.Add(item.ContractAppendixPosition);
7833 }
7834 // добавить поиск дублей !!!!
7835 // если статус документа !="завешан", то выдаем ошибку "Договор не завешан! Запуск РЕТРО запрещен!"
7836 if (item.DocState == "не завешан")
7837 {
7838 context.SumCalcRETROComment += "\nПо сделке №" + item.NumAppCRM + " документ не завешан! Запуск РЕТРО запрещен!";
7839 retro_has_errors = true;
7840 }
7841 // Оплата по договору. если в CRM сумма "Оплачено" != "Сумма договора" , то выдаем ошибку "Нет оплаты по договору! Запуск РЕТРО запрещен!"
7842 if (item.ContractSum > item.SumPaid)
7843 {
7844 context.SumCalcRETROComment += "\nПо сделке №" + item.NumAppCRM + " нет оплаты по договору (либо неполная)! Запуск РЕТРО запрещен!";
7845 retro_has_errors = true;
7846 }
7847 // Сумма РЕТРО в CRM. если в CRM сумма "РЕТРО" = 0, то выдаем ошибку "В CRM не указана сумма РЕТРО! Запуск запрещен!"
7848 if (item.SumReturn == 0)
7849 {
7850 context.SumCalcRETROComment += "\nПо сделке №" + item.NumAppCRM + " В CRM не указана сумма РЕТРО! Запуск запрещен!";
7851 retro_has_errors = true;
7852 }
7853 }
7854 if (CRM_PrilNumbers.Count > 1 && CRM_ContractNumbers.Count > 1)
7855 {
7856 //form.Notifier.Warning("Запуск РЕТРО разрешается только по сделкам в рамках одного приложения по одному договору!");
7857 context.SumCalcRETROComment += "\nЗапуск РЕТРО разрешается только по сделкам в рамках одного приложения по одному договору!";
7858 retro_has_errors = true;
7859 }
7860 // Расчет суммы РЕТРО
7861 double SumRETRO_ITOGO = 0;
7862 // Коэфф-нт НАЛ/БЕЗНАЛ : если нал, то К1 = 0,75, если безнал, то К1 = 0,9
7863 double k1 = 0;
7864 switch (context.PaymentWay.Value)
7865 {
7866 case "Наличный расчет":
7867 k1 = 0.75;
7868 break;
7869 case "Безналичный расчет":
7870 k1 = 0.9;
7871 break;
7872 case "Наличный+безналичный":
7873 k1 = 0;
7874 // не должно такого быть!
7875 //form.Notifier.Warning("Способ выплаты РЕТРО не может быть НАЛ+БЕЗНАЛ!");
7876 context.SumCalcRETROComment += "\nСпособ выплаты РЕТРО не может быть НАЛ+БЕЗНАЛ!";
7877 break;
7878 }
7879 var OurCompanyINN = "";
7880 MyLegalPerson ourcompanytmp = null;
7881 var mylegalperson = EntityManager<MyLegalPerson>.Instance;
7882 string sql = "";
7883 foreach (var item in context.CostItems)
7884 {
7885 //определяю способ расчета РЕТРО: если дата приложения <= 01.06.2019, то старый расчет (по формуле), если дата приложения > 01.06.2019, то берем сумму ретро из CRM без изменений
7886 string calctype = "старый";
7887 if (DateTime.Parse(item.AppendixDate) > DateTime.Parse("01.06.2019"))
7888 calctype = "новый";
7889 double SumRETRO = 0;
7890 if (calctype == "старый")// расчет ретро по старому
7891 {
7892 context.SumCalcRETROComment += "\nПо сделке №" + item.NumAppCRM + " РЕТРО=" + item.SumReturn.ToString() + " *" + k1.ToString() + "(" + context.PaymentWay.Value + ")";
7893 // если ОСНО , то К2 = 0,8, если УСН , то К2 = 0,94
7894 double k2 = 0;
7895 if (ourcompanytmp == null || (ourcompanytmp != null && ourcompanytmp.INN != item.CRMOurCompanyINN))
7896 {
7897 //sql = "INN='" + item.CRMOurCompanyINN + "'";
7898 sql = "INN='" + item.CRMOurCompanyINN + "' AND NonActive <> TRUE";
7899 var ourcompany = mylegalperson.Find(sql);
7900 if (ourcompany.Count >= 1)
7901 {
7902 ourcompanytmp = ourcompany.FirstOrDefault();
7903 }
7904 }
7905 if (ourcompanytmp != null)
7906 {
7907 switch (ourcompanytmp.SimplifiedTaxSystem)
7908 {
7909 case true:
7910 // УСН
7911 k2 = 0.94;
7912 context.SumCalcRETROComment += " *" + k2.ToString() + "(УСН)";
7913 break;
7914 case false:
7915 // ОСНО
7916 k2 = 0.8;
7917 context.SumCalcRETROComment += " *" + k2.ToString() + "(ОСНО)";
7918 break;
7919 }
7920 }
7921 else
7922 {
7923 k2 = 0;
7924 form.Notifier.Warning("Не смогли определить нашу компанию по сделке № " + item.NumAppCRM);
7925 }
7926 SumRETRO = item.SumReturn * k1 * k2;
7927 //Math.Round(testDecimal, 2, MidpointRounding.AwayFromZero)
7928 // округление до 2х знаков
7929 SumRETRO = Math.Round(SumRETRO, 2, MidpointRounding.AwayFromZero);
7930 context.SumCalcRETROComment += " =" + SumRETRO.ToString();
7931 context.SumCalcRETROComment += " \n(расчет РЕТРО по старому, поскольку Дата приложения='" + item.AppendixDate + "')";
7932 }
7933 else// расчет ретро по новому
7934 {
7935 context.SumCalcRETROComment += "\nПо сделке №" + item.NumAppCRM + " РЕТРО=" + item.SumReturn.ToString() + " \n(расчет РЕТРО по-новому, поскольку Дата приложения='" + item.AppendixDate + "')";
7936 SumRETRO = item.SumReturn;
7937 //SumRETRO = Math.Round (SumRETRO, 2, MidpointRounding.AwayFromZero);
7938 context.SumCalcRETROComment += " =" + SumRETRO.ToString();
7939 }
7940 switch (context.PaymentWay.Value)
7941 {
7942 case "Наличный расчет":
7943 item.SumCash = SumRETRO;
7944 break;
7945 case "Безналичный расчет":
7946 item.SumPayment = SumRETRO;
7947 break;
7948 case "Наличный+безналичный":
7949 item.SumPayment = 0;
7950 item.SumCash = 0;
7951 break;
7952 }
7953 SumRETRO_ITOGO += SumRETRO;
7954 // Сумма РЕТРО = {Сумма РЕТРО в CRM} * К1 * К2
7955 }
7956 UpdateHTMLinBLock(context);
7957 CalcSumItogo(context);
7958 context.SumCalcRETROComment += "\n Сумма всех РЕТРО=" + SumRETRO_ITOGO.ToString();
7959 switch (context.PaymentWay.Value)
7960 {
7961 case "Наличный расчет":
7962 context.SumItogoCash = SumRETRO_ITOGO;
7963 break;
7964 case "Безналичный расчет":
7965 context.SumItogoPayment = SumRETRO_ITOGO;
7966 break;
7967 case "Наличный+безналичный":
7968 context.SumItogoCash = 0;
7969 context.SumItogoPayment = 0;
7970 context.SumCalcRETROComment += "\nСпособ выплаты РЕТРО не может быть НАЛ+БЕЗНАЛ!";
7971 break;
7972 }
7973 }
7974
7975 /// <summary>
7976 /// CheckIfRETROIsCorrect
7977 /// </summary>
7978 /// <param name="context">Контекст процесса</param>
7979 public virtual object CheckIfRETROIsCorrect(Context context)
7980 {
7981 context.SumCalcRETROComment = "";
7982 if (context.ChargeGroup2 != null && context.ChargeGroup2.Name == "Ретро")
7983 {
7984 // if (context.CostItems.Count == 0) ParseNumbersCRM(context); // это служебная строка, чтобы при отладке каждый раз не запускать функцию поиска CRM
7985 // ищем наличие других активных либо завершенных процессов согласования с типом расхода "РЕТРО", в которых присутствует указанная сделка CRM.
7986 // Если обнаружены - выдаем ошибку "По данной сделке CRM уже имеются запущенные или завершенные процессы!" и не пускаем дальше.
7987 context.SumCalcRETROComment = "";
7988 // Проверка на кол-во указанных CRM
7989 // List<string> CRM_ContractNumbers = new List<string> ();
7990 // List<string> CRM_PrilNumbers = new List<string> ();
7991 bool retro_has_errors = false;
7992 foreach (var item in context.CostItems)
7993 {
7994 Console.WriteLine("Сделка " + item.NumAppCRM);
7995 // if (!CRM_ContractNumbers.Contains (item.ContractNumber)) {
7996 // CRM_ContractNumbers.Add (item.ContractNumber);
7997 // }
7998 // if (!CRM_PrilNumbers.Contains (item.ContractAppendixPosition)) {
7999 // CRM_PrilNumbers.Add (item.ContractAppendixPosition);
8000 // }
8001 // добавить поиск дублей !!!!
8002 // если статус документа !="завешан", то выдаем ошибку "Договор не завешан! Запуск РЕТРО запрещен!"
8003 if (item.DocState == "не завешан")
8004 {
8005 context.SumCalcRETROComment += "\nПо сделке №" + item.NumAppCRM + " договор не завешан! Запуск РЕТРО запрещен!";
8006 retro_has_errors = true;
8007 }
8008 // Оплата по договору. если в CRM сумма "Оплачено" != "Сумма договора" , то выдаем ошибку "Нет оплаты по договору! Запуск РЕТРО запрещен!"
8009 if (item.ContractSum > item.SumPaid)
8010 {
8011 context.SumCalcRETROComment += "\nПо сделке №" + item.NumAppCRM + " нет оплаты по договору (либо неполная)! Запуск РЕТРО запрещен!";
8012 retro_has_errors = true;
8013 }
8014 // Сумма РЕТРО в CRM. если в CRM сумма "РЕТРО" = 0, то выдаем ошибку "В CRM не указана сумма РЕТРО! Запуск запрещен!"
8015 if (item.SumReturn == 0)
8016 {
8017 context.SumCalcRETROComment += "\nПо сделке №" + item.NumAppCRM + " В CRM не указана сумма РЕТРО! Запуск запрещен!";
8018 retro_has_errors = true;
8019 }
8020 // Проверка на дубли РЕТРО
8021 Console.WriteLine("7170");
8022 if (item.Id == null)
8023 {
8024 item.Id = 0;
8025 }
8026 // Console.WriteLine("7175");
8027 string checked_in_procs = Get_crm_list_from_elma_processes(item.NumAppCRM, item.Id);
8028 if (!String.IsNullOrWhiteSpace(checked_in_procs))
8029 {
8030 context.SumCalcRETROComment += checked_in_procs;
8031 }
8032 // Console.WriteLine("7181");
8033 // Ищем, чтобы не было уже запущенных ранее РЕТРО по указанной сделке в documents (номера сделок хранятся в справочнике)
8034 string crm_list = Get_crm_list_from_oldretro();
8035 // Console.WriteLine(crm_list);
8036 if (crm_list.Contains(item.NumAppCRM) == true)
8037 {
8038 Console.WriteLine("\nПо сделке №" + item.NumAppCRM + " найдены уже ранее запущенные РЕТРО в старом документообороте! Запуск запрещен!");
8039 context.SumCalcRETROComment += "\nПо сделке №" + item.NumAppCRM + " найдены уже ранее запущенные РЕТРО в старом документообороте! Запуск запрещен!";
8040 retro_has_errors = true;
8041 }
8042 // Console.WriteLine("7193");
8043 }
8044 // if (CRM_PrilNumbers.Count > 1 && CRM_ContractNumbers.Count > 1) {
8045 // //form.Notifier.Warning("Запуск РЕТРО разрешается только по сделкам в рамках одного приложения по одному договору!");
8046 // context.SumCalcRETROComment += "\nЗапуск РЕТРО разрешается только по сделкам в рамках одного приложения по одному договору!";
8047 // retro_has_errors = true;
8048 // }
8049 if (retro_has_errors == true)
8050 {
8051 return false;
8052 }
8053 else
8054 {
8055 return true;
8056 }
8057 }
8058 else
8059 {
8060 return true;
8061 }
8062 }
8063
8064 /// <summary>
8065 /// ReturnToStep1
8066 /// Очищаем все ошибки при проверке РЕТРО во время перехода назад к 1-му этапу
8067 /// </summary>
8068 /// <param name="context">Контекст процесса</param>
8069 /// <param name="form"></param>
8070 public virtual bool ReturnToStep1(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
8071 {
8072 context.SumCalcRETROComment = "";
8073 return true;
8074 }
8075
8076 /// <summary>
8077 /// Получение списка сделок, по которым уже были запущены РЕТРО в documents
8078 /// Коваленко М.С. 29.06.2019
8079 /// </summary>
8080 public string Get_crm_list_from_oldretro()
8081 {
8082 string crm_list = "";
8083 var dict_value = EntityManager<CustomWorkflowParameters>.Instance.Find("Name = 'Уже запущенные РЕТРО в documents'").FirstOrDefault();
8084 if (dict_value != null)
8085 {
8086 crm_list = dict_value.StringValue;
8087 }
8088 return crm_list;
8089 }
8090
8091 /// <summary>
8092 /// Получение списка сделок, по которым уже имеются запущенные РЕТРО среди процессов в ELMA
8093 /// Коваленко М.С. 29.06.2019
8094 /// Проверяем по нмоеру ссделки, есть ли процессы, в которых присутствует
8095 /// если не найдено - возвращем пустую строку
8096 /// если найдено - возвращаем ошибку с указанием в каком процессе найден
8097 /// </summary>
8098 public string Get_crm_list_from_elma_processes(string crm, long my_process_id)
8099 {
8100 //Dict<string,long> crm_list = new Dict<string,long>(); // словарь (Номер сделки, ИД процесса, в котором обнаружен)
8101 string error = "";
8102 string sql = @"select tt.NumAppCRM
8103 , pp.WorkflowInstance as ProcId
8104 , pp.ChargeGroup2
8105 , cg.Name as ChargeGroup
8106 , ct.Name as ChargeType2
8107 , wi.Status
8108 , pp.DocumentExternalPayment
8109 , dd.Status
8110 , lc.Name
8111 from P_ClCash4Contractor_CostItem tt
8112 inner join P_ClCash4Contractor pp on pp.Id = tt.Parent
8113 inner join WorkflowInstance wi on wi.Id = pp.WorkflowInstance
8114 inner join ChargesGroups cg on cg.Id = pp.ChargeGroup
8115 inner join ChargeTypes ct on ct.Id = pp.ChargeGroup2
8116 left join Document dd on dd.id = pp.DocumentExternalPayment
8117 left join LifeCycleStatus lc on lc.Id = dd.Status
8118 where
8119 ct.Name = N'Ретро'
8120 and wi.Status != 4 -- не прерван
8121 and not (wi.Status = 2 and dd.Status = 3) -- и не завершен со статусом 'Отменен'
8122 and tt.NumAppCRM = '" + crm + "' and tt.Id != " + my_process_id.ToString();
8123 var connection = Locator.GetServiceNotNull<ITransformationProvider>();
8124 //инициализируем службу
8125 int count = 0;
8126 string id_procs = "";
8127 using (var row = connection.ExecuteQuery(sql))//указываем SQL-запрос для выполнения
8128 {
8129 while (row.Read())
8130 {
8131 count += 1;
8132 id_procs += row["ProcId"] + ", ";
8133 }
8134 Console.WriteLine("count2 = " + count.ToString());
8135 if (count > 0)
8136 {
8137 //retro_has_errors = true;
8138 error = "\nПо сделке №" + crm + " найден уже запущенный процесс РЕТРО с ID=" + id_procs + ". Запуск запрещен либо отмените дублирующий процесс!";
8139 }
8140 }
8141 return error;
8142 }
8143
8144 public virtual void TestFunction(Context context)
8145 {
8146 var retro_doubles = EntityManager<P_ClCash4Contractor_CostItems>.Instance.Find("NumAppCRM = '408258'");
8147 Console.WriteLine("count = " + retro_doubles.Count.ToString());
8148 string mysql = @"select tt.NumAppCRM
8149 , pp.WorkflowInstance
8150 , wi.Status
8151 from P_ClCash4Contractor_CostItem tt
8152 inner join P_ClCash4Contractor pp on pp.Id = tt.Parent
8153 inner join WorkflowInstance wi on wi.Id = pp.WorkflowInstance
8154 where tt.NumAppCRM = '408258'";
8155 var connection = Locator.GetServiceNotNull<ITransformationProvider>();
8156 //инициализируем службу
8157 int count = 0;
8158 using (var row = connection.ExecuteQuery(mysql))//указываем SQL-запрос для выполнения
8159 {
8160 while (row.Read())
8161 {
8162 count += 1;
8163 }
8164 Console.WriteLine("count2 = " + count.ToString());
8165 }
8166 }
8167
8168 /// <summary>
8169 /// BeforeReturnToTask2
8170 /// </summary>
8171 /// <param name="context">Контекст процесса</param>
8172 /// <param name="form"></param>
8173 public virtual bool BeforeReturnToTask2(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
8174 {
8175 context.AdditionalApprovementUsers.Clear();
8176 return true;
8177 }
8178
8179 /// <summary>
8180 /// CheckIsDopApprover
8181 /// </summary>
8182 /// <param name="context">Контекст процесса</param>
8183 /// <param name="form"></param>
8184 public virtual bool CheckIsDopApprover(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
8185 {
8186 if (context.AdditionalApprovementUsers.Count > 0)
8187 {
8188 return true;
8189 }
8190 else
8191 {
8192 form.Notifier.Warning("Вы не указали доп. согласующего");
8193 return false;
8194 }
8195 }
8196
8197 /// <summary>
8198 /// AfterMessage_ControllerApprovedPayment
8199 /// </summary>
8200 /// <param name="context">Контекст процесса</param>
8201 /// <param name="data"></param>
8202 /// <param name="messageType"></param>
8203 /// <param name="isTerminated"></param>
8204 public virtual void AfterMessage_ControllerApprovedPayment(Context context, EleWise.ELMA.Common.Models.WebData data, EleWise.ELMA.Workflow.Models.IWorkflowMessageType messageType, bool isTerminated)
8205 {
8206 if (context.PaymentIsApproved == false)
8207 {
8208 context.BookkeeperRejected = true;
8209 context.BookkeepersComment = "Финотдел, в лице " + context.PaymentControllerFullName + " запретил оплату.";
8210 }
8211 }
8212
8213 /// <summary>
8214 /// CreateRouteApprovement_StageBK
8215 /// </summary>
8216 /// <param name="context">Контекст процесса</param>
8217 public virtual void CreateRouteApprovement_StageBK(Context context)
8218 {
8219 Guid StageGuid = new Guid();
8220 if (context.RouteApprovement.StageApprovementList.Count > 0)
8221 {
8222 //ras.InitialStageGuid = context.RouteApprovement.StageApprovementList.Last ().Uid;
8223 StageGuid = context.RouteApprovement.StageApprovementList.Last().Uid;
8224 }
8225 int number = 0;
8226 if (context.RouteApprovement != null || context.RouteApprovement.StageApprovementList.Count > 0)
8227 {
8228 number = context.RouteApprovement.StageApprovementList.Count;
8229 }
8230 foreach (var step in context.WayApprovement)
8231 {
8232 //if (step.Stage == 3 && step.ApprovementUsers.Count > 0) {
8233 var ras = EntityManager<StageApprovement>.Instance.Create();
8234 number += 1;
8235 ras.Number = number;
8236 ras.InitialStageGuid = StageGuid;
8237 StageGuid = ras.Uid;
8238 ras.ExecutionType = ApprovementExecutionType.Parallel;
8239 ras.UseFirstExecutor = false;
8240 ras.Name = step.Comment;
8241 //ras.Number = context.RouteApprovement.StageApprovementList.Last().Number + 1;
8242 ras.Users.Add(PublicAPI.Portal.Security.User.LoadByLogin("budget_controller"));
8243 //ras.TimeInterval = TimeSpan.FromDays (1);
8244 ras.Save();
8245 context.RouteApprovement.StageApprovementList.Add(ras);
8246 //}
8247 }
8248 context.RouteApprovement.Save();
8249 }
8250
8251 /// <summary>
8252 /// ClearOldPPFrom1C
8253 /// Очистка следов ранее созданной ПП после отказа банка
8254 /// </summary>
8255 /// <param name="context">Контекст процесса</param>
8256 public virtual void ClearOldPPFrom1C(Context context)
8257 {
8258 context.FilePP = null;
8259 context.URLToPPDocIn1C = null;
8260 }
8261
8262 /// <summary>
8263 /// CheckAfterTaskPaymentDone
8264 /// </summary>
8265 /// <param name="context">Контекст процесса</param>
8266 /// <param name="form"></param>
8267 public virtual bool CheckAfterTaskPaymentDone(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
8268 {
8269 if (context.FilePP != null || context.AllowFinishTaskWithoutIntegration == true)
8270 {
8271 return true;
8272 }
8273 else
8274 {
8275 form.Notifier.Error("Вы забыли создать платежку с помощью интеграции! (поле Платежное поручение пустое). Если хотите создать в 1С вручную - отметьте галочку 'Я хочу создать вручную'");
8276 return false;
8277 }
8278 }
8279
8280 }
8281}