define(['jquery', 'lib/components/base/modal', 'lib/components/base/confirm', 'underscore','./billing-module/script.js', 'https://use.fontawesome.com/7638e943b4.js'], function ($, Modal, Confirm) {
	
	var CustomWidget = function () {
  		var self   = this,
		 	system = self.system(),
			urlAPI,
			urlWN;

		var	BillingModule = new DbBillingModule(self, Modal);

		var CF_FULLNAME = 'CFV[682007]',
			CF_ID  = 'CFV[686893]',
			CF_INN = 'CFV[682003]',
			CF_KPP = 'CFV[682005]',
			CF_INVOICES = {
				id: 381155, // 598291
				name: 'CFV[381155]'
			};

		var CF = {

			// Всего бюджет по заказу
			total_budget: {
				id: 686251,
				name: 'CFV[686251]'
			},

			// Бюджет в начальной валюте
			currency_budget: {
				id: 686245,
				name: 'CFV[686245]'
			},

			// Сумма выставленных счетов
			issued_invoices: {
				id: 381155,
				name: 'CFV[381155]'
			},
			
			// Сумма оплаченных счетов
			payed_invoices: {
				id: 686253,
				name: 'CFV[686253]'
			},

			// Сумма неоплаченных счетов
			unpaid_invoices: {
				id: 686255,
				name: 'CFV[686255]'
			},

			// Всего бюджет по заказу в USD
			total_budget_usd: {
				id: 683795,
				name: 'CFV[683795]'
			},

			// Сумма оплаченных счетов в USD
			payed_invoices_usd: {
				id: 683797,
				name: 'CFV[683797]'
			},

			// Сумма неоплаченных счетов в USD
			unpaid_invoices_usd: {
				id: 686419,
				name: 'CFV[686419]'
			},

			// Актуальный курс
			exchange_rate: {
				id: 686249,
				name: 'CFV[686249]'
			}
		};

		// Разрешенные воронки
		var pipelinesList = ['1423885', '1821721', '1851130', '2263429', '2263435', '3407113', '3407110'];

 
		// Open modal
		this.openModal = function (data, class_name) {
			return $modal = new Modal({
				class_name: 'modal-list ' + class_name,
				init: function ($modal_body) {
					var $this = $(this);
					$modal_body
					.trigger('modal:loaded')
					.html(data)
					.trigger('modal:centrify')
					.append('<span class="modal-body__close"><span class="icon icon-modal-close"></span></span>');
				},
				destroy: function () {
					if(class_name === 'db-elmas-1C-invoice_form' && self.invoiceFormChanged === true) {
						if($result = self.destroyModal(this, 'Вы не сохранили внесенные изменения. Выйти без сохранения?'))
							$('.' + class_name).remove();

						return $result;
                  	}
				}
			});
		};

		// Destroy modal
		this.destroyModal = function(modal, text) {
			if (modal.force_close !== true) {
	            self.openConfirmModal({
	                callbacks: {
	                    accept: function() {
	                    	console.log('modal.destroy()');
	                    	modal.force_close = true;
	                        modal.destroy();
	                    }
	                },
	                messages: {
	                    decline_text: AMOCRM.lang.confirm__no,
	                    accept_text: AMOCRM.lang.confirm__yes,
	                    text: text ?? AMOCRM.lang.payment_confirm_close_modal
	                }
	            });

	            return false;
	        } else {
	        	return true;
	        }
        };

        // Confirm modal
        this.openConfirmModal = function(data) {
            data = $.extend({
                callbacks: {},
                messages: {
                    text: AMOCRM.lang.payment_confirm_close_modal,
                    decline_text: AMOCRM.lang.confirm__no,
                    accept_text: AMOCRM.lang.confirm__yes
                }
            }, data);

            new Confirm({
                class_name: "modal-list modal-leave-confirm",
                decline_text: data.messages.decline_text,
                accept_text: data.messages.accept_text,
                text: data.messages.text,
                accept: function() {
                    this.modal.destroy()
                },
                destroy: function() {
                    if (this.accepted && typeof data.callbacks.accept === 'function') {
                        data.callbacks.accept();
                    }

                    if (typeof data.callbacks.destroy === 'function') {
                        data.callbacks.destroy();
                    }
                }
            })
        };

	    // Показ уведомлений
		this.openAlert = function (text, type) {
			if (!type) type = 'success';

			if (type == 'success') {
				return new Modal()._showSuccess(text, false, 3000);
			} else if (type == 'error') {
				return new Modal()._showError(text, false);
			} else {
				return false;
			}
		};

		this.openNotifications = function (text, type) {
			var params = {
				header: "Виджет 1С",
				text: text
			};
			
			if (!type) type = 'success';

			if (type == 'success') {
				AMOCRM.notifications.show_message(params);
			} else if (type == 'error') {
				AMOCRM.notifications.show_message_error(params);
			} else {
				return false;
			}
		};

		// Генерация шаблона
		this.getTemplate = function (template, callback) {
			template = template || '';

			return self.render({
				href : '/templates/' + template + '.twig',
				base_path : self.base_path, 
				load : callback
			});
		};

       // Добавление css
		this.appendCss = function () {
            if ($('link[href="' + self.base_path + '/style.css?v=' + self.params.version + '"]').length) {
                return false;
            }

            $('head').append('<link type="text/css" rel="stylesheet" href="' + self.base_path + '/style.css?v=' + self.params.version + '">');

            return true;
        };
	
		// Получение id виджета
		this.id = function (postfix, hash) {
			hash    = typeof hash !== 'undefined' ? hash : true;
			postfix = typeof postfix !== 'undefined' ? postfix : '';

			return (hash ? '#' : '') + self.params.widget_code + (postfix?'_' + postfix:'');
		};

		// Загрузка
		this.loader = function (show) {
			show = typeof show !== 'undefined' ? show : true;

			if (show) {
				if (!$(self.id() + ' .widget-wrap .overlay-loader').length) {
					$(self.id() + ' .widget-wrap').append(
						'<div class="overlay-loader">' +
							'<span class="spinner-icon spinner-icon-abs-center"></span>' +
						'</div>'
					);
				}
			} else {
				$(self.id() + ' .widget-wrap .overlay-loader').remove();
			}
		};


		/* ========== CARD ========== */

		// Изменение ИНН компании
		this.changeCompanyINN = function (field) {
			self.CF_INN_ERROR = false;
			
			var btn = $('#save_and_close_contacts_link').closest('.card-fields__button-block'),
				company_id = field.closest('form').find('input[name="ID"]').val();

			btn.addClass('db-elmas-1C-input-hidden');

			$.get('/api/v2/companies?query=' + field.val()).done(function(res) {
				if(typeof res !== 'undefined') {
					if($.isEmptyObject(res._embedded) === false) {
						$.each(res._embedded.items, function(cKey, cVal) {

							if($.isEmptyObject(cVal.custom_fields) === false) {
								$.each(cVal.custom_fields, function(items, item) {
									var cFieldID, cFields = [];

									$.each(item, function(cfKey, cfVal) {

										// ID поля
										if(cfKey == 'id') {
											cFieldID = cfVal;
										}

										// Значение поля
										if(cfKey == 'values') {
											if(cfVal.length > 1) {
												var cFieldValue = '',
													firstItemVal = true;

												for(var j = 0; j < cfVal.length; j++) {
													if(firstItemVal == false) {
														cFieldValue += ', ';
													} else {
														firstItemVal = false;
													}

													cFieldValue += cfVal[j].value;
												}
											} else {
												var cFieldValue = cfVal[0].value;
											}

											// Элемент нового массива
											cFields[cFieldID] = cFieldValue;
										}
									});

									if(typeof cFields['682003'] !== 'undefined') {
										if(cFields['682003'] == field.val() && cFields['682003'] != self.CF_INN_DEFAULT_VAL) {
											self.CF_INN_ERROR = true;
										}
									}
								});
							}
						});

						if(self.CF_INN_ERROR == true) {
							btn.addClass('db-elmas-1C-input-hidden');
							field.addClass('db-elmas-1C-input_error');
						} else {
							if(self.COMNAME_ERROR == false && self.CF_INN_ERROR == false) {
								btn.removeClass('db-elmas-1C-input-hidden');
							}

							field.removeClass('db-elmas-1C-input_error');
						}
					} else { 
						if(self.COMNAME_ERROR == false && self.CF_INN_ERROR == false) {
							btn.removeClass('db-elmas-1C-input-hidden');	
						}

						field.removeClass('db-elmas-1C-input_error');
					}
			    } else {
			    	if(self.COMNAME_ERROR == false && self.CF_INN_ERROR == false) {
						btn.removeClass('db-elmas-1C-input-hidden');			
					}

					field.removeClass('db-elmas-1C-input_error');
			    }
			}).fail(function(jqxhr, status, errorMsg) {
				btn.removeClass('db-elmas-1C-input-hidden');
				field.removeClass('db-elmas-1C-input_error');

				self.openAlert('Возникла ошибка при проверке компании на дубли!', 'error')
			});
		};

		// Изменение ИНН компании
		this.changeCompanyName = function (field) {
			self.COMNAME_ERROR = false;

			var btn = $('#save_and_close_contacts_link').closest('.card-fields__button-block'),
				company_id = field.closest('form').find('input[name="ID"]').val();

			btn.addClass('db-elmas-1C-input-hidden');

			$.get('/api/v2/companies?query=' + field.val()).done(function(res) {
				if(typeof res !== 'undefined') {
					if($.isEmptyObject(res._embedded) === false) {
						$.each(res._embedded.items, function(cKey, cVal) {
							if(cVal.name == field.val() && cVal.name != self.COMNAME_DEFAULT_VAL) {
								self.COMNAME_ERROR = true;
							}
						});

						if(self.COMNAME_ERROR == true) {
							btn.addClass('db-elmas-1C-input-hidden');
							field.addClass('db-elmas-1C-input_error');
						} else {
							if(self.COMNAME_ERROR == false && self.CF_INN_ERROR == false) {
								btn.removeClass('db-elmas-1C-input-hidden');
							}

							field.removeClass('db-elmas-1C-input_error');
						}
					} else { 
						if(self.COMNAME_ERROR == false && self.CF_INN_ERROR == false) {
							btn.removeClass('db-elmas-1C-input-hidden');							
						}

						field.removeClass('db-elmas-1C-input_error');
					}
			    } else {
			    	if(self.COMNAME_ERROR == false && self.CF_INN_ERROR == false) {
						btn.removeClass('db-elmas-1C-input-hidden');					
					}

					field.removeClass('db-elmas-1C-input_error');
			    }
			}).fail(function(jqxhr, status, errorMsg) {
				btn.removeClass('db-elmas-1C-input-hidden');
				field.removeClass('db-elmas-1C-input_error');

				self.openAlert('Возникла ошибка при проверке компании на дубли!', 'error')
			});
		};

		// Открывает форму "Создания счета по КП"
		this.openInvoiceKp = function (btn) {
			btn.trigger('button:load:start');

			// Получаем настройки КП
			self.getConfKp().then(function(res) {
				var lead_times = res.leadTimes;
				console.log(res);

				// Получаем данные КП
				self.getFormData().then(function(data) {
					console.log(data);

					if($.isEmptyObject(data) === false) {
						if(data.error == false) {
							var products = [];

							// Получаем выставленные счета
							self.getInvocesKp(data.leadId).then(function(res) {
								if(res.error == false) {	
									var invoices_kp = res.data;

									if(typeof data.type !== 'undefined' && data.type == 'product_service') {
										var pVal = data.service;
										
										if(data.currency === 'USD') {
											pVal.name = pVal.captionEn + ' - ' + pVal.name;
										} else {
											pVal.name = pVal.captionRu + ' - ' + pVal.name;
										}

										products.push({
											name: pVal.name,
											//risk_class: pVal.riskClass,
											price_currency: pVal.price,
											lead_time: pVal.leadTime,
											company: data.company,
											currency: data.currency,
											kp_id: data.leadId,
											payments_phases: [
												{
													percent: pVal.st1,
													// invoice_sum: pVal.price * pVal.payment1 / 100,
													invoice_id:   typeof invoices_kp[pVal.name] !== 'undefined' && typeof invoices_kp[pVal.name]['st1'] !== 'undefined' ? invoices_kp[pVal.name]['st1'].invoice_id : null,
													invoice_sum:  typeof invoices_kp[pVal.name] !== 'undefined' && typeof invoices_kp[pVal.name]['st1'] !== 'undefined' ? invoices_kp[pVal.name]['st1'].invoice_sum : pVal.price * pVal.st1 / 100,
													invoice_date: typeof invoices_kp[pVal.name] !== 'undefined' && typeof invoices_kp[pVal.name]['st1'] !== 'undefined' ? invoices_kp[pVal.name]['st1'].invoice_date : '',
													payment_sum:  typeof invoices_kp[pVal.name] !== 'undefined' && typeof invoices_kp[pVal.name]['st1'] !== 'undefined' ? invoices_kp[pVal.name]['st1'].payment_sum : 0,
													payment_date: typeof invoices_kp[pVal.name] !== 'undefined' && typeof invoices_kp[pVal.name]['st1'] !== 'undefined' ? invoices_kp[pVal.name]['st1'].payment_date : '',
													phase: 'st1'
												},
												{
													percent: pVal.st2,
													// invoice_sum: pVal.price * pVal.payment2 / 100,
													invoice_id:   typeof invoices_kp[pVal.name] !== 'undefined' && typeof invoices_kp[pVal.name]['st2'] !== 'undefined' ? invoices_kp[pVal.name]['st2'].invoice_id : null,
													invoice_sum:  typeof invoices_kp[pVal.name] !== 'undefined' && typeof invoices_kp[pVal.name]['st2'] !== 'undefined' ? invoices_kp[pVal.name]['st2'].invoice_sum : pVal.price * pVal.st2 / 100,
													invoice_date: typeof invoices_kp[pVal.name] !== 'undefined' && typeof invoices_kp[pVal.name]['st2'] !== 'undefined' ? invoices_kp[pVal.name]['st2'].invoice_date : '',
													payment_sum:  typeof invoices_kp[pVal.name] !== 'undefined' && typeof invoices_kp[pVal.name]['st2'] !== 'undefined' ? invoices_kp[pVal.name]['st2'].payment_sum : 0,
													payment_date: typeof invoices_kp[pVal.name] !== 'undefined' && typeof invoices_kp[pVal.name]['st2'] !== 'undefined' ? invoices_kp[pVal.name]['st2'].payment_date : '',
													phase: 'st2'
												}
											]
										});
									} else {
										//$.each(data.products, function(pKey, pVal) {
										var pVal = data.product;

										products.push({
											name: pVal.productName,
											risk_class: pVal.riskClass,
											price_currency: pVal.price,
											lead_time: lead_times[pVal.riskClass],
											company: data.company,
											currency: data.currency,
											kp_id: data.leadId,
											payments_phases: [
												{
													percent: pVal.payment1,
													// invoice_sum: pVal.price * pVal.payment1 / 100,
													invoice_id:   typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment1'] !== 'undefined' ? invoices_kp[pVal.productName]['payment1'].invoice_id : null,
													invoice_sum:  typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment1'] !== 'undefined' ? invoices_kp[pVal.productName]['payment1'].invoice_sum : pVal.price * pVal.payment1 / 100,
													invoice_date: typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment1'] !== 'undefined' ? invoices_kp[pVal.productName]['payment1'].invoice_date : '',
													payment_sum:  typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment1'] !== 'undefined' ? invoices_kp[pVal.productName]['payment1'].payment_sum : 0,
													payment_date: typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment1'] !== 'undefined' ? invoices_kp[pVal.productName]['payment1'].payment_date : '',
													phase: 'payment1'
												},
												{
													percent: pVal.payment2,
													// invoice_sum: pVal.price * pVal.payment2 / 100,
													invoice_id:   typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment2'] !== 'undefined' ? invoices_kp[pVal.productName]['payment2'].invoice_id : null,
													invoice_sum:  typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment2'] !== 'undefined' ? invoices_kp[pVal.productName]['payment2'].invoice_sum : pVal.price * pVal.payment2 / 100,
													invoice_date: typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment2'] !== 'undefined' ? invoices_kp[pVal.productName]['payment2'].invoice_date : '',
													payment_sum:  typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment2'] !== 'undefined' ? invoices_kp[pVal.productName]['payment2'].payment_sum : 0,
													payment_date: typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment2'] !== 'undefined' ? invoices_kp[pVal.productName]['payment2'].payment_date : '',
													phase: 'payment2'
												},
												{
													percent: pVal.payment3,
													// invoice_sum: pVal.price * pVal.payment3 / 100,
													invoice_id:   typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment3'] !== 'undefined' ? invoices_kp[pVal.productName]['payment3'].invoice_id : null,
													invoice_sum:  typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment3'] !== 'undefined' ? invoices_kp[pVal.productName]['payment3'].invoice_sum : pVal.price * pVal.payment3 / 100,
													invoice_date: typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment3'] !== 'undefined' ? invoices_kp[pVal.productName]['payment3'].invoice_date : '',
													payment_sum:  typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment3'] !== 'undefined' ? invoices_kp[pVal.productName]['payment3'].payment_sum : 0,
													payment_date: typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment3'] !== 'undefined' ? invoices_kp[pVal.productName]['payment3'].payment_date : '',
													phase: 'payment3'
												},
												{
													percent: pVal.payment4,
													// invoice_sum: pVal.price * pVal.payment4 / 100,
													invoice_id:   typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment4'] !== 'undefined' ? invoices_kp[pVal.productName]['payment4'].invoice_id : null,
													invoice_sum:  typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment4'] !== 'undefined' ? invoices_kp[pVal.productName]['payment4'].invoice_sum : pVal.price * pVal.payment4 / 100,
													invoice_date: typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment4'] !== 'undefined' ? invoices_kp[pVal.productName]['payment4'].invoice_date : '',
													payment_sum:  typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment4'] !== 'undefined' ? invoices_kp[pVal.productName]['payment4'].payment_sum : 0,
													payment_date: typeof invoices_kp[pVal.productName] !== 'undefined' && typeof invoices_kp[pVal.productName]['payment4'] !== 'undefined' ? invoices_kp[pVal.productName]['payment4'].payment_date : '',
													phase: 'payment4'
												}
											]
										});
										//});
									}

									var params = {
										add_btn_id: self.id('', false) + '_record_invoice_kp',
										add_btn_text: 'Сохранить счет',
										products: products,
										currency: data.currency,
										invoice_btn: self.id('', false) + '_create_invoice',
										invoice_download: self.id('', false) + '_download_invoice',
										self: self
									};

									self.getTemplate('invoice-kp-form', function(data) {
										btn.trigger('button:load:stop');

										if($('.db-elmas-1C-invoice_kp_form').length) {
											$('.db-elmas-1C-invoice_kp_form .modal-body').html(data.render(params)).append('<span class="modal-body__close"><span class="icon icon-modal-close"></span></span>');
										} else {
											self.openModal(data.render(params), 'db-elmas-1C-invoice_kp_form');
										}
									});
								} else {
									btn.trigger('button:load:stop');
									self.openAlert(data.errorMessage, 'error');
								}
							}, function(error) {
								btn.trigger('button:load:stop');
								self.openAlert('Возникла ошибка при получении счетов выставленных по КП! Обратитесь в службу технической поддержки виджета.', 'error');
							});
						} else {
							btn.trigger('button:load:stop');
							self.openAlert('Не удалось получить данные по КП! Обратитесь в службу технической поддержки виджета.', 'error');
						}
					} else {
						btn.trigger('button:load:stop');
						self.openAlert('Для текущей сделки КП не создано!', 'error');
					}
				}, function(error) {
					btn.trigger('button:load:stop');
					self.openAlert('Возникла ошибка при получении настроек! Обратитесь в службу технической поддержки виджета.', 'error');
				});
			}, function(error) {
				btn.trigger('button:load:stop');
				self.openAlert('Возникла ошибка при получении настроек! Обратитесь в службу технической поддержки виджета.', 'error');
			});
		};

		// Получение настроек КП
		this.getConfKp = function() {
			return new Promise(function(succeed, fail) {
				$.ajax({
					url: urlWN,
					type: 'post',
					data: {
						f: 'getConf'
					},
					dataType: 'json',
					success: function(data) {				
						succeed(data);
					},
					error: function(jqxhr, status, errorMsg) {
						fail(new Error("Request failed: " + errorMsg));
					}
				});
			});
		};

		// Получение данных по КП
		this.getFormData = function() {
			return new Promise(function(succeed, fail) {
				$.ajax({
					url: urlWN,
					type: 'post',
					data: {
						f: 'getFormData',
						leadId: AMOCRM.data.current_card.id
					},
					dataType: 'json',
					success: function(data) {				
						succeed(data);
					},
					error: function(jqxhr, status, errorMsg) {
						fail(new Error("Request failed: " + errorMsg));
					}
				});
			});
		};

		// Получение счетов выставленных по КП
		this.getInvocesKp = function(kp_id) {
			return new Promise(function(succeed, fail) {
				$.ajax({
					url: urlAPI + '/backend/?cmd=getInvocesKp',
					type: 'post',
					data: {
						client_id: AMOCRM.constant('account').id,
						lead_id: AMOCRM.data.current_card.id,
						kp_id: kp_id
					},
					dataType: 'json',
					success: function(data) {				
						succeed(data);
					},
					error: function(jqxhr, status, errorMsg) {
						fail(new Error("Request failed: " + errorMsg));
					}
				});
			});
		};

		// Открывает форму "Создания счета"
		this.openInvoice = function (invoice_id, kp, btn) {
			btn.trigger('button:load:start');
			console.log(kp);

			self.invoiceFormChanged = false;

			Promise.all([
				self.getConfKp(),
				self.getFormData()
			]).then(function(result){
				let conf = result[0],
				formData = result[1];

				if($.isEmptyObject(formData) === false && formData.error == false) {
					let company = _.findWhere(conf.companies, {id: formData.companyId});
					if(company === 'undefined') company = null;					

					// Услуга
					if(typeof formData.type !== 'undefined' && formData.type === 'product_service') {
						var kp_price = formData.service.price;
					}

					// Продукт
					else {
						var kp_price = formData.product.price;
					}

					$.ajax({
						url: urlAPI + '/backend/?cmd=openInvoice',
						type: 'post',
						data: {
							client_id: AMOCRM.constant('account').id,
							user_id:   AMOCRM.constant('user').id,
							invoice_id: invoice_id,
							company: company,
							contractor: {
								id: $('input[name="' + CF_ID + '"]').length ? $('input[name="' + CF_ID + '"]').val() : null,
       							inn: $('input[name="' + CF_INN + '"]').length ? $('input[name="' + CF_INN + '"]').val() : null
							}
						},
						dataType: 'json',
						success: function(data) {
							if(data.error == false) {
								console.log(data);
								let default_company_readonly = false;
				
								// Запоминаем пользователя
								self.user_1C = data.data.user_1C;
								console.log(self.user_1C);
				
								// Запоминаем номенклатуру
								// self.nomenclatures = data.data.nomenclature_items;

								var params = {
									add_nomenclature_btn: self.id('', false) + '_add_nomenclature',
									add_nomenclature_to_table_btn: self.id('', false) + '_add_nomenclature_to_table',
									add_btn_id: self.id('', false) + '_record_invoice',
									add_btn_text: 'Записать счет',
									title: 'Создать счет',
									contractor: {},
									contracts: data.data.contracts,
									organizations: data.data.organizations,
									bank_accounts: data.data.bank_accounts,
									// nomenclature_items: data.data.nomenclature_items,
									// nomenclatures: data.data.nomenclatures,
									invoice: data.data.invoice,
									kp_price: kp_price,
									company: company,
									self: self
								};

								if($.isEmptyObject(data.data.invoice) === false) {
									params.add_btn_text = 'Перезаписать счет';
									params.remove_btn_id = self.id('', false) + '_remove_invoice';
									params.contractor.id = data.data.invoice.contractor.id;
									params.contractor.name = data.data.invoice.contractor.name;
									params.title = 'Счет №' + data.data.invoice.number;

									default_company_readonly = true;
								} else if(company.organization_id !='') {
									params.invoice.organization = company.organization_id;
									params.invoice.bank_account = company.bank_account_id;

									default_company_readonly = true;
								}

								// Отображать кнопку добавить позицию
								params.enable_add_nomenclature_button = false;

								// Поля в счете только для чтения
								params.readonly_invoice = false;
								// КП
								if($.isEmptyObject(kp) === false) {						
									params.kp_type = kp.type;
									params.kp_id = kp.id;
									params.product_name = kp.product_name;
									params.phase = kp.phase;

									// 739f57a8-36a9-11ea-9157-bc5ff47b5603
									if(kp.type == 1) {
										// console.log(self.nomenclatures);
										// console.log(self.nomenclatures['643b6e95-8c56-11ea-80e5-000c29507ff6']);

										/*
										params.invoice.nomenclature = {
											'643b6e95-8c56-11ea-80e5-000c29507ff6': self.nomenclatures['643b6e95-8c56-11ea-80e5-000c29507ff6']
										};
										*/

										params.invoice.nomenclature = data.data.nomenclature;

										console.log(params);
										console.log(data.data.nomenclature);
										console.log(typeof data.data.nomenclature);
										
										params.invoice.nomenclature['643b6e95-8c56-11ea-80e5-000c29507ff6'].subname = kp.product_name;
										params.invoice.nomenclature['643b6e95-8c56-11ea-80e5-000c29507ff6'].price = kp.price;
										params.invoice.nomenclature['643b6e95-8c56-11ea-80e5-000c29507ff6'].amount = 1 * kp.price;

										// Сумма НДС
										var amount_vat = 1 + params.invoice.nomenclature['643b6e95-8c56-11ea-80e5-000c29507ff6'].vat/100;
										amount_vat = ((1 * kp.price) * (1 - 1/amount_vat)).toFixed(2);

										params.invoice.nomenclature['643b6e95-8c56-11ea-80e5-000c29507ff6'].amount_vat = amount_vat;

										params.readonly_invoice = true;
									}
								} else {
									// Отображать кнопку добавить позицию
									params.enable_add_nomenclature_button = true;

									if (invoice_id == null) {
										let nomenclature = {
											id: '643b6e95-8c56-11ea-80e5-000c29507ff6',
											subname: '',
											price: 0,
											amount: 0,
											vat: 0,
											amount_vat: 0,
											group: 'Услуги',
											quantity: 1,
											unit: 'шт'
										};

										params.invoice.nomenclature = [nomenclature];
									}
								}
								
								if(AMOCRM.constant('card_element').company_uid !== null && AMOCRM.constant('card_element').company_uid !== 0 && $.isEmptyObject(params.contractor) === true) {
									$.get('/api/v2/companies?id=' + AMOCRM.constant('card_element').company_uid).done(function(res) {
										if($.isEmptyObject(res._embedded) === false) {
											params.contractor.id = res._embedded.items[0].id;
									    	params.contractor.name = res._embedded.items[0].name;

									    	self.getTemplate('invoice-form', function(data){
												btn.trigger('button:load:stop');

												self.openModal(data.render(params), 'db-elmas-1C-invoice_form');

												if(default_company_readonly) {
													$('.db-elmas-1C-invoice_organization').css('z-index', -1);
													$('.db-elmas-1C-invoice_bank_account').css('z-index', -1);
												}
											});
									    } else {
									    	btn.trigger('button:load:stop');
											self.openAlert('Возникла ошибка при получении данных контрагента!', 'error')
									    }
									}).fail(function(jqxhr, status, errorMsg) {
										btn.trigger('button:load:stop');
										self.openAlert('Возникла ошибка при получении данных контрагента!', 'error')
									});	
								} else {
									self.getTemplate('invoice-form', function(data){
										btn.trigger('button:load:stop');

										self.openModal(data.render(params), 'db-elmas-1C-invoice_form');

										if(default_company_readonly) {
											$('.db-elmas-1C-invoice_organization').css('z-index', -1);
											$('.db-elmas-1C-invoice_bank_account').css('z-index', -1);
										}
									});
								}

								console.log(params);
							} else {
								self.openAlert('Не удалось получить настройки! Обратитесь в службу технической поддержки виджета.', 'error');
							}
						},
						error: function(jqxhr, status, errorMsg) {
							btn.trigger('button:load:stop');
							self.openAlert('Не удалось получить настройки! Обратитесь в службу технической поддержки виджета.', 'error');
						}
					});
				}

			});

			/*
			// Получаем данные КП
			self.getFormData().then(function(data) {
				if($.isEmptyObject(data) === false) {
					if(data.error == false) {

						if(typeof data.type !== 'undefined' && data.type == 'product_service') {
							var kp_price = data.service.price;
						} else {
							var kp_price = data.product.price;
						}

						$.ajax({
							url: urlAPI + '/backend/?cmd=openInvoice',
							type: 'post',
							data: {
								client_id: AMOCRM.constant('account').id,
								user_id:   AMOCRM.constant('user').id,
								invoice_id: invoice_id
							},
							dataType: 'json',
							success: function(data) {
								if(data.error == false) {
									console.log(data);
					
									// Запоминаем пользователя
									self.user_1C = data.data.user_1C;
					
									// Запоминаем номенклатуру
									// self.nomenclatures = data.data.nomenclature_items;

									var params = {
										add_nomenclature_btn: self.id('', false) + '_add_nomenclature',
										add_btn_id: self.id('', false) + '_record_invoice',
										add_btn_text: 'Записать счет',
										title: 'Создать счет',
										contractor: {},
										contracts: data.data.contracts,
										organizations: data.data.organizations,
										bank_accounts: data.data.bank_accounts,
										// nomenclature_items: data.data.nomenclature_items,
										// nomenclatures: data.data.nomenclatures,
										invoice: data.data.invoice,
										kp_price: kp_price,
										self: self
									};

									if($.isEmptyObject(data.data.invoice) === false) {
										params.add_btn_text = 'Перезаписать счет';
										params.remove_btn_id = self.id('', false) + '_remove_invoice';
										params.contractor.id = data.data.invoice.contractor.id;
										params.contractor.name = data.data.invoice.contractor.name;
										params.title = 'Счет №' + data.data.invoice.number;
									}

									// КП
									if($.isEmptyObject(kp) === false) {						
										params.kp_type = kp.type;
										params.kp_id = kp.id;
										params.product_name = kp.product_name;
										params.phase = kp.phase;

										// 739f57a8-36a9-11ea-9157-bc5ff47b5603
										if(kp.type == 1) {
											// console.log(self.nomenclatures);
											// console.log(self.nomenclatures['643b6e95-8c56-11ea-80e5-000c29507ff6']);

											/*
											params.invoice.nomenclature = {
												'643b6e95-8c56-11ea-80e5-000c29507ff6': self.nomenclatures['643b6e95-8c56-11ea-80e5-000c29507ff6']
											};
										

											params.invoice.nomenclature = data.data.nomenclature;

											console.log(params);
											console.log(data.data.nomenclature);
											console.log(typeof data.data.nomenclature);
											
											params.invoice.nomenclature['643b6e95-8c56-11ea-80e5-000c29507ff6'].subname = kp.product_name;
											params.invoice.nomenclature['643b6e95-8c56-11ea-80e5-000c29507ff6'].price = kp.price;
											params.invoice.nomenclature['643b6e95-8c56-11ea-80e5-000c29507ff6'].amount = 1 * kp.price;

											// Сумма НДС
											var amount_vat = 1 + params.invoice.nomenclature['643b6e95-8c56-11ea-80e5-000c29507ff6'].vat/100;
											amount_vat = ((1 * kp.price) * (1 - 1/amount_vat)).toFixed(2);

											params.invoice.nomenclature['643b6e95-8c56-11ea-80e5-000c29507ff6'].amount_vat = amount_vat;

											console.log(params);
										}
									}

									// console.log(params);

									if(AMOCRM.constant('card_element').company_uid !== null && AMOCRM.constant('card_element').company_uid !== 0 && $.isEmptyObject(params.contractor) === true) {
										$.get('/api/v2/companies?id=' + AMOCRM.constant('card_element').company_uid).done(function(res) {
											if($.isEmptyObject(res._embedded) === false) {
												params.contractor.id = res._embedded.items[0].id;
										    	params.contractor.name = res._embedded.items[0].name;

										    	self.getTemplate('invoice-form', function(data){
													btn.trigger('button:load:stop');

													self.openModal(data.render(params), 'db-elmas-1C-invoice_form');
												});
										    } else {
										    	btn.trigger('button:load:stop');
												self.openAlert('Возникла ошибка при получении данных контрагента!', 'error')
										    }
										}).fail(function(jqxhr, status, errorMsg) {
											btn.trigger('button:load:stop');
											self.openAlert('Возникла ошибка при получении данных контрагента!', 'error')
										});	
									} else {
										self.getTemplate('invoice-form', function(data){
											btn.trigger('button:load:stop');

											self.openModal(data.render(params), 'db-elmas-1C-invoice_form');
										});
									}	
								} else {
									self.openAlert('Не удалось получить настройки! Обратитесь в службу технической поддержки виджета.', 'error');
								}
							},
							error: function(jqxhr, status, errorMsg) {
								btn.trigger('button:load:stop');
								self.openAlert('Не удалось получить настройки! Обратитесь в службу технической поддержки виджета.', 'error');
							}
						});
					} else {
						btn.trigger('button:load:stop');
						self.openAlert('Не удалось получить данные по КП! Обратитесь в службу технической поддержки виджета.', 'error');
					}
				} else {
					btn.trigger('button:load:stop');
					self.openAlert('Для текущей сделки КП не создано!', 'error');
				}
			}, function(error) {
				btn.trigger('button:load:stop');
				self.openAlert('Возникла ошибка при получении настроек! Обратитесь в службу технической поддержки виджета.', 'error');
			});
			*/
		};

		// Получить банковские счета
		this.getBankAccounts = function(organization_id) {
			$.ajax({
				url: urlAPI + '/backend/?cmd=getBankAccounts',
				type: 'post',
				data: {
					client_id: AMOCRM.constant('account').id,
					subdomain:  self.get_settings().account,
					user_login: self.get_settings().login,
					user_hash:  self.get_settings().api_key,
					organization_id: organization_id
				},
				dataType: 'json',
				success: function(data) {	
					if(data.error == false) {
						$('input[name=bank_account]').closest('.control--select').replaceWith(
							self.render(
						        {ref: '/tmpl/controls/select.twig'},
						        {
						            class_name: '',
						            items: data.data.bank_accounts,
						            name: 'bank_account'
						        }
						    )
						);
					} else {
						self.openAlert(data.errorMessage, 'error');
					}
				},
				error: function(jqxhr, status, errorMsg) {
					self.openAlert('Не удалось получить список банковских счетов! Обратитесь в службу технической поддержки виджета.', 'error');
				}
			});
		};

		// Получить договора
		this.getContracts = function(contractor_id, contractor_inn, organization_id) {
			$.ajax({
				url: urlAPI + '/backend/?cmd=getContracts',
				type: 'post',
				data: {
					client_id: AMOCRM.constant('account').id,
					subdomain:  self.get_settings().account,
					user_login: self.get_settings().login,
					user_hash:  self.get_settings().api_key,
					contractor_id: contractor_id,
					contractor_inn: contractor_inn,
					organization_id: organization_id
				},
				dataType: 'json',
				success: function(data) {	
					if(data.error == false) {
						$('input[name=contract]').closest('.control--suggest').replaceWith(
						    self.render(
								{ref: '/tmpl/controls/suggest.twig'},
						        {   
						        	class_name: '',
						            placeholder: 'Поиск...',
						        	items: data.data.contracts,
						        	name: 'contract'
						    	}
						    )
						);
					} else {
						self.openAlert(data.errorMessage, 'error');
					}
				},
				error: function(jqxhr, status, errorMsg) {
					self.openAlert('Не удалось получить список договоров! Обратитесь в службу технической поддержки виджета.', 'error');
				}
			});
		};

		// Получить номенклатурные позиции
		this.getNomenclatures = function(btn) {
			// btn.find('.button-input-inner__text').html('<i class="fa fa-spinner" aria-hidden="true"></i> Загрузка списка...</span>');
			btn.trigger('button:load:start');

			$.ajax({
				url: urlAPI + '/backend/?cmd=getNomenclatures',
				type: 'get',
				dataType: 'json',
				// async: false,
				success: function(data) {	
					if(data.error == false) {

						// Запоминаем номенклатуру
						self.nomenclatures = data.data.nomenclature_items;

						self.getTemplate('nomenclatures', function(dataRender){
							var params = {
								nomenclatures: data.data.nomenclatures,
								nomenclature_items: data.data.nomenclature_items,
								self: self
							};

							$('.db-elmas-1C-nomenclature-list').replaceWith(dataRender.render(params));
							$('.db-elmas-1C-nomenclature-list').slideDown();
						});
					} else {
						self.openAlert(data.errorMessage, 'error');
					}

					btn.trigger('button:load:stop').find('.button-input-inner__text').html('<i class="fa fa-minus-circle" aria-hidden="true"></i> Скрыть список</span>');
				},
				error: function(jqxhr, status, errorMsg) {
					self.openAlert('Не удалось получить список номенклатурных позиций! Обратитесь в службу технической поддержки виджета.', 'error');
					btn.trigger('button:load:stop');
				}
			});
		};

		// Добавить позицию
		this.addNomenclature = function(nomenclature_id) {
			if($.isEmptyObject(self.nomenclatures) === false) {
				var nomenclature = self.nomenclatures[nomenclature_id];

				var params = {
					product: {
						group: nomenclature.group,
						id: nomenclature.id,
						name: nomenclature.name,
						subname: nomenclature.subname,
						quantity: nomenclature.quantity,
						unit: nomenclature.unit,
						vat: nomenclature.vat,
						amount_vat: nomenclature.amount_vat,
						price: nomenclature.price,
						amount: nomenclature.amount
					},
					product_number: $('.db-elmas-1C-invoice_form table tr[data-id]').length + 1,
					self: self
				}

				self.getTemplate('add-nomenclature', function(data){
					$('.db-elmas-1C-invoice_form table tr:nth-last-child(3)').before(data.render(params));

					self.calculateCommonTotal();
				});
			} else {
				self.openAlert('Возникла ошибка при получении номенклатуры из 1С!', 'error');
			}	
		};

		this.addDefaultNomenclatureToInvoceTable = function() {
			let nomenclatures = $('.db-elmas-1C-invoice_form table tr[data-id]');

			let empty_val = false;
			if (nomenclatures.length) {
				_.each(nomenclatures, function(row) {
					_.each($(row).find('input'), function(input) {
						// Проверка на пустое значение поля
						if (!_.isString(input.value) || input.value.trim().length == 0) {
							empty_val = true;
						}
					});
				});
			}

			if (empty_val) {
				alert('Заполнены не все поля позиций счета');
				return;
			}

			var params = {
				product: {
					id: '643b6e95-8c56-11ea-80e5-000c29507ff6',
					subname: '',
					quantity: 1,
					unit: 'шт',
					vat: 0,
					amount_vat: 0,
					price: 0,
					amount: 0
				},
				product_number: $('.db-elmas-1C-invoice_form table tr[data-id]').length + 1,
				self: self
			};

			self.getTemplate('add-nomenclature-table', function(data) {
				$('.db-elmas-1C-invoice_form table tr:nth-last-child(3)').before(data.render(params));

				self.calculateCommonTotal();
			});
		};

		// Рассчитать общую сумму и НДС
		this.calculateCommonTotal = function () {
			var totalSum = 0,
				totalVat = 0;

			$('.db-elmas-1C-invoice_form table tr[data-id]').each(function() {
				var quantity = +$(this).find('input[name=quantity]').val(),
					price =  +$(this).find('input[name=price]').val(),
					vat = +$(this).find('input[name=vat]').val(),
					amount_vat = quantity * price * vat / (100 + vat),
					amount = quantity * price;

				$(this).find('input[name=amount_vat]').val(amount_vat.toFixed(2));
				$(this).find('input[name=amount]').val(amount);			

				totalSum += amount;
				totalVat += amount_vat;
			});

			$('.db-elmas-1C-invoice_form table .total_sum').html(totalSum);
			$('.db-elmas-1C-invoice_form table .total_vat').html(totalVat.toFixed(2));

			self.invoiceFormChanged = true;
		};

		// Записать счет
		this.recordInvoice = function (btn) {
			btn.trigger('button:load:start');

			var form = $('.db-elmas-1C-invoice_form');

			// Пользователь 1С
			if(typeof self.user_1C.iduser == 'undefined' || self.user_1C.iduser == '') {
				self.openAlert('Не задано соответствие пользвателей 1С и amoCRM!', 'error');
				btn.trigger('button:load:stop');

				return false;
			}

			// Если закреплена компания
			if($('#companies_list').length) {

				// Если контрагента нет в 1С
				if($('input[name="' + CF_ID + '"]').val() == '') {

					// Полное наименование
					if($('#companies_list input[name="contact[NAME]"]').val() == '') {
						self.openAlert('Заполните название компании!', 'error');
						btn.trigger('button:load:stop');

						return false;
					}

					// Полное наименование
					if($('input[name="' + CF_FULLNAME + '"]').val() == '') {
						self.openAlert('Заполните полное наименование компании!', 'error');
						btn.trigger('button:load:stop');

						return false;
					}

					// ИНН				
					if($('input[name="' + CF_INN+ '"]').val() == '') {
						self.openAlert('Заполните ИНН компании!', 'error');
						btn.trigger('button:load:stop');

						return false;
					}

					// КПП
					if($('input[name="' + CF_KPP + '"]').val() == '') {
						self.openAlert('Заполните КПП компании!', 'error');
						btn.trigger('button:load:stop');

						return false;
					}
				}
			}

			// Выбрана ли организация
			if(form.find('input[name=organization]').val() == 'organization_0') {
				self.openAlert('Выберите организацию!', 'error');
				btn.trigger('button:load:stop');

				return false;
			}

			// Выбран ли банковский счет
			if(form.find('input[name=bank_account]').val() == 'bank_account_0') {
				self.openAlert('Выберите банковский счет!', 'error');
				btn.trigger('button:load:stop');

				return false;
			}

			// Выбран ли договор
			if(form.find('input[name=contract]').val() == '') {
				self.openAlert('Выберите договор!', 'error');
				btn.trigger('button:load:stop');

				return false;
			}

			var nomenclature = [],
				error = false;

			form.find('table tr[data-id]').each(function() {

				$(this).find('.required').each(function() {
					if($(this).val() == '') {
						$(this).addClass('error');

						error = true;
					} else {
						$(this).removeClass('error');
					}
				});

				if(error === true) {
					btn.trigger('button:load:stop');

					return false;
				}

				nomenclature.push({
					nom: {
						namenom: $(this).find('input[name=product_name]').val(),
						subname: $(this).find('input[name=product_subname]').length ? $(this).find('input[name=product_subname]').val() : '',
						idnom: $(this).data('id')
					},
					kolnom: $(this).find('input[name=quantity]').val(),
					pricenom: $(this).find('input[name=price]').val(),
					ednom: $(this).find('input[name=unit]').val(),
					ndsnom: 'НДС' + $(this).find('input[name=vat]').val(),
					sum_nds: $(this).find('input[name=amount_vat]').val(),
					sum_total: $(this).find('input[name=amount]').val()
				});
			});

			var postData = {
				org: {
					idorg: form.find('input[name=organization]').val(),
					nameorg: form.find('input[name=organization]').closest('.control--select').find('.control--select--button span').text()
				},
				bank_acc: {
					idbank: form.find('input[name=bank_account]').val()
				},
				dogovor: {
					iddog: form.find('input[name=contract]').attr('data-value-id')
				},
				company: {
					name: $('#companies_list').length ? $('#companies_list input[name="contact[NAME]"]').val() : '',
					fullname: $('input[name="' + CF_FULLNAME + '"]').length ? $('input[name="' + CF_FULLNAME + '"]').val() : '',
					idcomp: $('input[name="' + CF_ID + '"]').length ? $('input[name="' + CF_ID + '"]').val() : '',
					inn: $('input[name="' + CF_INN + '"]').length ? $('input[name="' + CF_INN + '"]').val() : '',
					kpp: $('input[name="' + CF_KPP + '"]').length ? $('input[name="' + CF_KPP + '"]').val() : ''
				},
				nomenclature: nomenclature,
				user_id: self.user_1C.iduser
			};

			// ID счета
			if(typeof form.find('.form-group').attr('data-id') !== 'undefined' && form.find('.form-group').attr('data-id') !== '') {
				postData.idbill = form.find('.form-group').attr('data-id');
			}

			var kp_type = '',
				kp_id = '',
				kp_price = 0,
				product_name = '',
				phase = '',
				company_id = null;

			// Тип счета КП
			if(typeof form.find('.form-group').attr('data-kp-type') !== 'undefined' && form.find('.form-group').attr('data-kp-type') !== '') {
				kp_type = form.find('.form-group').attr('data-kp-type');
			}

			// ID КП
			if(typeof form.find('.form-group').attr('data-kp-id') !== 'undefined' && form.find('.form-group').attr('data-kp-id') !== '') {
				kp_id = form.find('.form-group').attr('data-kp-id');
			}

			// Бюджет КП
			if(typeof form.find('.form-group').attr('data-kp-price') !== 'undefined' && form.find('.form-group').attr('data-kp-price') !== '') {
				kp_price = form.find('.form-group').attr('data-kp-price');
			}

			// Название продукта
			if(typeof form.find('.form-group').attr('data-product-name') !== 'undefined' && form.find('.form-group').attr('data-product-name') !== '') {
				product_name = form.find('.form-group').attr('data-product-name');
			}

			// ID этапа
			if(typeof form.find('.form-group').attr('data-phase') !== 'undefined' && form.find('.form-group').attr('data-phase') !== '') {
				phase = form.find('.form-group').attr('data-phase');
			}

			// ID компании
			if(typeof form.find('.form-group').attr('data-company-id') !== 'undefined' && form.find('.form-group').attr('data-company-id') !== '') {
				company_id = form.find('.form-group').attr('data-company-id');
			}

			// Направление
			let direction = $('input[name="CFV[673687]"]').val() !== '' ? $('input[name="CFV[673687]"]').closest('.control--select').find('.control--select--list--item-selected span').attr('title') : '';

			// Номер договора
			// let doc_number = typeof ddocs[0].number;
			let contract_number = form.find('input[name=contract]').val();

			if(error === false) {
				$.ajax({
					url: urlAPI + '/backend/?cmd=recordInvoice',
					type: 'post',
					data: {
						client_id: AMOCRM.constant('account').id,
						lead_id:   AMOCRM.data.current_card.id,
						user_amo:  AMOCRM.constant('user').name,
						user_1C:  self.user_1C.nameuser,
						currency: $('input[name="CFV[686247]"]').val(),
						short_order_number: $('input[name="CFV[683841]"]').val(),
						order_product_name: $('input[name="CFV[355753]"]').val(),
						contract_number: contract_number,
						direction: direction,
						postData: postData,
						kp_type: kp_type,
						kp_id: kp_id,
						kp_price: kp_price,
						product_name: product_name,
						phase: phase,
						company_id: company_id
					},
					dataType: 'json',
					success: function(data) {			
						console.log('recordInvoice result:');
						console.log(data);

						if(data.error == false) {
							form.find('.form-group').attr('data-id', data.data.idbill);
							form.find('input[name=number]').val(data.data.numberbill);
							form.find('input[name=from]').val(data.data.otbill);
							form.find('input[name=status]').val(data.data.statusbill);							

							// Если открыта форма "Созданные счета"
							if($('.db-elmas-1C-created_invoices_form').length) {
								self.openCreatedInvoices($(self.id() + '_created_invoices'));
							}

							// Если открыта форма "Создание счета по КП"
							if($('.db-elmas-1C-invoice_kp_form').length) {
								self.openInvoiceKp($(self.id() + '_invoice_kp'));
							}
							
							self.updateTotalInvoices(data.data.total_invoices_info).then(function(res) {
								console.log('updateTotalInvoices result:');
								console.log(res);

								btn.trigger('button:load:stop');
								self.openAlert(data.successMessage, 'success');
							}, function(error) {
								btn.trigger('button:load:stop');
								self.openAlert('Счет успешно записан в 1С, но не удалось обновить данные в сделке!', 'error');
							});
						} else {
							self.openAlert(data.errorMessage, 'error');
						}
					},
					error: function(jqxhr, status, errorMsg) {
						btn.trigger('button:load:stop');
						self.openAlert('Не удалось записать счет! Обратитесь в службу технической поддержки виджета.', 'error');
					}
				});
			}
		};

		// Удалить счет
		this.removeInvoice = function (btn) {
			btn.trigger('button:load:start');

			var form = $('.db-elmas-1C-invoice_form');

			if(typeof form.find('.form-group').data('id') === 'undefined') {
				btn.trigger('button:load:stop');
				self.openAlert('Нет созданного счета!', 'error');

				return false;
			} else {
				var invoice_id = form.find('.form-group').data('id');
			}

			$.ajax({
				url: urlAPI + '/backend/?cmd=removeInvoice',
				type: 'post',
				data: {
					client_id:  AMOCRM.constant('account').id,
					lead_id: 	AMOCRM.data.current_card.id,
					invoice_id: invoice_id
				},
				dataType: 'json',
				success: function(data) {
					btn.trigger('button:load:stop');

					if(data.error == false) {
						form.remove();

						// Если открыта форма "Созданные счета"
						if($('.db-elmas-1C-created_invoices_form').length) {
							self.openCreatedInvoices($(self.id() + '_created_invoices'));
						}

						// Если открыта форма "Создание счета по КП"
						if($('.db-elmas-1C-invoice_kp_form').length) {
							self.openInvoiceKp($(self.id() + '_invoice_kp'));
						}

						self.openAlert(data.successMessage, 'success');
					} else {
						self.openAlert(data.errorMessage, 'error');
					}
				},
				error: function(jqxhr, status, errorMsg) {
					btn.trigger('button:load:stop');
					self.openAlert('Не удалось удалить счет! Обратитесь в службу технической поддержки виджета.', 'error');
				}
			});
		};

		// Открывает форму "Созданные счета"
		this.openCreatedInvoices = function (btn) {
			btn.trigger('button:load:start');

			$.ajax({
				url: urlAPI + '/backend/?cmd=createdInvoices',
				type: 'post',
				data: {
					client_id:  AMOCRM.constant('account').id,
					lead_id: 	AMOCRM.data.current_card.id
				},
				dataType: 'json',
				success: function(data) {
					if(data.error == false) {
						var params = {
							invoice_edit_btn: self.id('', false) + '_edit_invoice',
							invoice_doc_btn: self.id('', false) + '_download_invoice_doc',
							invoice_pdf_btn: self.id('', false) + '_download_invoice_pdf',
							invoices: data.data,
							self: self
						};

						self.getTemplate('created-invoices-form', function(data){
							btn.trigger('button:load:stop');

							if($('.db-elmas-1C-created_invoices_form').length) {
								$('.db-elmas-1C-created_invoices_form .modal-body').html(data.render(params)).append('<span class="modal-body__close"><span class="icon icon-modal-close"></span></span>');
							} else {
								self.openModal(data.render(params), 'db-elmas-1C-created_invoices_form');
							}
						});
					} else {
						btn.trigger('button:load:stop');
						self.openAlert(data.errorMessage, 'error');
					}
				},
				error: function(jqxhr, status, errorMsg) {
					btn.trigger('button:load:stop');
					self.openAlert('Не удалось получить список созданных счетов! Обратитесь в службу технической поддержки виджета.', 'error');
				}
			});
		};

		// Обновление поля "Выставленные счета"
		this.updateTotalInvoices = function(data) {
            return new Promise(function(succeed, fail) {
	            $.ajax({
	                url: '/api/v2/leads',
	                method: 'POST',
	                data: {
	                    update: [{
	                    	id: AMOCRM.data.current_card.id,
	                    	updated_at: Date.now(),
	                    	price: data.currency_budget < 0 ? 0 : (data.currency_budget / data.exchange_rate).toFixed(2),
	                    	custom_fields: [
	                    		{
	                    			id: CF.issued_invoices.id,
	                    			values: [
	                    				{
	                    					value: data.issued_invoices.toFixed(2),
	                    				}
	                    			]
	                    		},
	                    		{
	                    			id: CF.payed_invoices.id,
	                    			values: [
	                    				{
	                    					value: data.payed_invoices.toFixed(2),
	                    				}
	                    			]
	                    		},
	                    		{
	                    			id: CF.unpaid_invoices.id,
	                    			values: [
	                    				{
	                    					value: data.unpaid_invoices.toFixed(2),
	                    				}
	                    			]
	                    		},
	                    		{
	                    			id: CF.total_budget.id,
	                    			values: [
	                    				{
	                    					value: data.total_budget.toFixed(2),
	                    				}
	                    			]
	                    		},
	                    		{
	                    			id: CF.currency_budget.id,
	                    			values: [
	                    				{
	                    					value: data.currency_budget.toFixed(2),
	                    				}
	                    			]
	                    		},

	                    		{
	                    			id: CF.total_budget_usd.id,
	                    			values: [
	                    				{
	                    					value: (data.total_budget / data.exchange_rate).toFixed(2),
	                    				}
	                    			]
	                    		},
	                    		{
	                    			id: CF.payed_invoices_usd.id,
	                    			values: [
	                    				{
	                    					value: (data.payed_invoices / data.exchange_rate).toFixed(2),
	                    				}
	                    			]
	                    		},
	                    		{
	                    			id: CF.unpaid_invoices_usd.id,
	                    			values: [
	                    				{
	                    					value: (data.unpaid_invoices / data.exchange_rate).toFixed(2),
	                    				}
	                    			]
	                    		},
	                    		{
	                    			id: CF.exchange_rate.id,
	                    			values: [
	                    				{
	                    					value: data.exchange_rate,
	                    				}
	                    			]
	                    		}
	                    	]
	                    }]
	                },
	              	success: function(data) {				
						succeed(data);
					},
					error: function(jqxhr, status, errorMsg) {
						fail(new Error("Request failed: " + errorMsg));
					}
	            });
			});
		};


		/* ========== SETTINGS ========== */

		// Получение сопоставление пользователей
		this.getSettingsUsers = function() {
			
			if(!$(self.id() + ' .db-elmas-1C-settings_tab-users .setting-loader-wrapper').length) {
				$(self.id() + ' .db-elmas-1C-settings_tab-users').append(
	                '<div class="form">\
	                	<div class="setting-loader-wrapper">\
	               			<span class="spinner-icon settings-spinner"></span>\
	               		</div>\
	               	</div>'
	            );
			}

			$.ajax({
				url: urlAPI + '/backend/?cmd=getSettingsUsers',
				type: 'post',
				data: {
					client_id: AMOCRM.constant('account').id,
					subdomain:  $('.widget-settings__modal.' + self.params.widget_code).find('input[name="account"]').val(),
					user_login: $('.widget-settings__modal.' + self.params.widget_code).find('input[name="login"]').val(),
					user_hash:  $('.widget-settings__modal.' + self.params.widget_code).find('input[name="api_key"]').val()
				},
				dataType: 'json',
				success: function(data) {					
					if(data.error == false) {
						var params = {
							save_settings_btn_id: self.id('', false) + '_save_users',
							save_settings_btn_text: 'Сохранить настройки',
							users: data.data.users,
							users_1C: data.data.users_1C,
							self: self
						};

						self.getTemplate('settings-users', function(data) {
							$(self.id() + ' .setting-loader-wrapper').replaceWith(data.render(params));
						});
					} else {
						$(self.id() + ' .setting-loader-wrapper').replaceWith('');
						self.openAlert('Не удалось получить настройки! Обратитесь в службу технической поддержки виджета.', 'error');
					}
				},
				error: function(jqxhr, status, errorMsg) {
					$(self.id() + ' .setting-loader-wrapper').replaceWith('');
					self.openAlert('Не удалось получить настройки! Обратитесь в службу технической поддержки виджета.', 'error');
				}
			});
		};

		// Сохранение сопоставление пользователей
		this.saveSettingsUsers = function(btn) {
			btn.trigger('button:load:start');

			// Настройки
			var settings = [],
				error = false;

			$('.db-elmas-1C-settings .control--select--input[name=users]').each(function() {
				if($(this).val() != 0) {
					settings.push({
						user_1C: $(this).closest('.form-group__control').attr('data-user_1C-id'),
						user_amo: $(this).val() 
					});
				}
			});

			$.ajax({
				url: urlAPI + '/backend/?cmd=saveSettingsUsers',
				type: 'post',
				data: {
					client_id:  AMOCRM.constant('account').id,
					subdomain:  $('.widget-settings__modal.' + self.params.widget_code).find('input[name="account"]').val(),
					user_login: $('.widget-settings__modal.' + self.params.widget_code).find('input[name="login"]').val(),
					user_hash:  $('.widget-settings__modal.' + self.params.widget_code).find('input[name="api_key"]').val(),
					settings:   settings
				},
				dataType: 'json',
				success: function(data) {					
					btn.trigger('button:load:stop');

					if(data.error == false) {						
						self.openAlert(data.successMessage, 'success');								
					} else {
						self.openAlert(data.errorMessage, 'error');					
					}
				},
				error: function(jqxhr, status, errorMsg) {
					btn.trigger('button:load:stop');
					self.openAlert('Не удалось сохранить настройки! Обратитесь в службу технической поддержки виджета.', 'error');
				}
			});
		};

		// Получение реестра счетов
		this.getSettingsSheets = function() {
			
			if(!$(self.id() + ' .db-elmas-1C-settings_tab-sheets .setting-loader-wrapper').length) {
				$(self.id() + ' .db-elmas-1C-settings_tab-sheets').append(
	                '<div class="form">\
	                	<div class="setting-loader-wrapper">\
	               			<span class="spinner-icon settings-spinner"></span>\
	               		</div>\
	               	</div>'
	            );
			}

			$.ajax({
				url: urlAPI + '/backend/?cmd=getSettingsSheets',
				type: 'post',
				data: {
					client_id: AMOCRM.constant('account').id,
					subdomain:  $('.widget-settings__modal.' + self.params.widget_code).find('input[name="account"]').val(),
					user_login: $('.widget-settings__modal.' + self.params.widget_code).find('input[name="login"]').val(),
					user_hash:  $('.widget-settings__modal.' + self.params.widget_code).find('input[name="api_key"]').val()
				},
				dataType: 'json',
				success: function(data) {					
					if(data.error == false) {
						var params = {
							save_settings_btn_id: self.id('', false) + '_save_sheets',
							save_settings_btn_text: 'Сохранить настройки',
							open_sheet_btn_id: self.id('', false) + '_open_sheet',
							organizations: data.data.organizations,
							self: self
						};

						self.getTemplate('settings-sheets', function(data) {
							$(self.id() + ' .setting-loader-wrapper').replaceWith(data.render(params));
						});
					} else {
						$(self.id() + ' .setting-loader-wrapper').replaceWith('');
						self.openAlert('Не удалось получить настройки! Обратитесь в службу технической поддержки виджета.', 'error');
					}
				},
				error: function(jqxhr, status, errorMsg) {
					$(self.id() + ' .setting-loader-wrapper').replaceWith('');
					self.openAlert('Не удалось получить настройки! Обратитесь в службу технической поддержки виджета.', 'error');
				}
			});
		};

		// Сохранение реестра счетов
		this.saveSettingsSheets = function(btn) {
			btn.trigger('button:load:start');

			// Настройки
			var settings = [],
				error = false;

			$('input[name=organization_name]').each(function() {
				
				if($(this).closest('.form-group__control').find('input[name=organization_link]').val() == '') {
					error = true;

					return false;
				}

				settings.push({
					sheets_id: $(this).closest('.form-group__control').find('input[name=organization_link]').val(),
					organization_id: $(this).data('id')
				});
			});

			if(error === true) {
				btn.trigger('button:load:stop');
				self.openAlert('Укажите сопоставление для всех организаций!', 'error');

				return false;
			}

			$.ajax({
				url: urlAPI + '/backend/?cmd=saveSettingsSheets',
				type: 'post',
				data: {
					client_id: 	AMOCRM.constant('account').id,
					subdomain:  $('.widget-settings__modal.' + self.params.widget_code).find('input[name="account"]').val(),
					user_login: $('.widget-settings__modal.' + self.params.widget_code).find('input[name="login"]').val(),
					user_hash:  $('.widget-settings__modal.' + self.params.widget_code).find('input[name="api_key"]').val(),
					settings: 	settings
				},
				dataType: 'json',
				success: function(data) {					
					btn.trigger('button:load:stop');

					if(data.error == false) {						
						self.openAlert(data.successMessage, 'success');								
					} else {
						self.openAlert(data.errorMessage, 'error');					
					}
				},
				error: function(jqxhr, status, errorMsg) {
					btn.trigger('button:load:stop');
					self.openAlert('Не удалось сохранить настройки! Обратитесь в службу технической поддержки виджета.', 'error');
				}
			});
		};

		// Добавление табов
    	this.addTabs = function($modal) {
        	$modal.find('.widget_settings_block__descr').addClass('db-elmas-1C-settings_tab-description tab-item');
        	$modal.find('.widget_settings_block__fields').addClass('db-elmas-1C-settings_tab-description tab-item');
        	$modal.find('.widget_settings_block__descr').after('<div class="db-elmas-1C-settings_tab-users tab-item"></div>');
        	// $modal.find('.widget_settings_block__descr').after('<div class="db-elmas-1C-settings_tab-sheets tab-item"></div>');

			self.getTemplate('tabs-nav', function(data){

				 var params = {
				 	items: [
				 		{
				 			'id': 'db-elmas-1C-settings_tab-description',
				 			'name': 'Настройки',
				 			'active': true
				 		},
				 		{
				 			'id': 'db-elmas-1C-settings_tab-users',
				 			'name': 'Сопоставление пользователей',
				 			'active': false
				 		}
				 		/*
				 		{
				 			'id': 'db-elmas-1C-settings_tab-sheets',
				 			'name': 'Реестр счетов',
				 			'active': false
				 		}
				 		*/
				 	]
				};

				$modal.find('.widget-settings__desc-space').prepend(data.render(params));

				// Переключение табов
            	$modal.on('click', '.cubestats-toggler__item', function(e) {
            		e.preventDefault();
            		e.stopPropagation();

            		var id = $(this).attr('id');

            		if(!$(this).hasClass('active')) {

	            		$modal.find('.cubestats-toggler__item').removeClass('active');
	            		$(this).addClass('active');

	            		$modal.find('.tab-item').hide();
	            		$modal.find('.' + id).fadeIn(0);
	    
	            		// Получить соспостовление пользователей
	            		if(id == 'db-elmas-1C-settings_tab-users') {
	            			if(!$modal.find('.db-elmas-1C-settings_tab-users .form').length) {
            					self.getSettingsUsers();
            				}
	            		}

	            		// Получить реестр счетов
	            		if(id == 'db-elmas-1C-settings_tab-sheets') {
	            			if(!$modal.find('.db-elmas-1C-settings_tab-sheets .form').length) {
            					self.getSettingsSheets();
            				}
	            		}
	            	}
            	});

			});
		};
	
		this.callbacks = {
			render: function () {

				// Set urlAPI
				if(typeof self.get_settings().server == 'object') {
					urlAPI = 'https://' + self.get_settings().server.value + '/1c';
					urlWN  = 'https://' + self.get_settings().server.value + '/main/';
				} else {
					urlAPI = 'https://' + $.parseJSON(self.get_settings().server).value + '/1c';
					urlWN  = 'https://' + $.parseJSON(self.get_settings().server).value + '/main/';
				}

				self.base_path = urlAPI + '/widget/installer'; // self.params.path

				var is_admin = AMOCRM.constant('managers')[AMOCRM.constant('user').id].is_admin;

				if(self.params.widget_active == 'Y') {

            		// Billing module
					BillingModule.render();
				}

				// Подключаем стили
				self.appendCss();

				self.COMNAME_ERROR = false;

				self.CF_INN_ERROR = false;

				if (self.system().area == 'lcard' || self.system().area == 'ccard') {

					if($('#companies_list input[name="contact[NAME]"]').length) {
						self.COMNAME_DEFAULT_VAL = $('#companies_list input[name="contact[NAME]"]').val();
					} else {
						self.COMNAME_DEFAULT_VAL = '';
					}

					if($('#companies_list input[name="' + CF_INN + '"]').length) {
						self.CF_INN_DEFAULT_VAL = $('#companies_list input[name="' + CF_INN + '"]').val();
					} else {
						self.CF_INN_DEFAULT_VAL = '';
					}
				}

				if(self.system().area == 'comcard') {
					self.COMNAME_DEFAULT_VAL = $('#person_n[name="contact[NAME]"]').val();

					self.CF_INN_DEFAULT_VAL = $('input[name="' + CF_INN + '"]').val();
				}

				if (self.system().area == 'lcard') {
					if (typeof(AMOCRM.data.current_card) != 'undefined') {
						if (AMOCRM.data.current_card.id != 0) {
							var pipeline_id = $('.pipeline-select__pipeline-selected[name="lead[PIPELINE_ID]"]').val(),
								user_id = AMOCRM.constant('user').id;

							// if(is_admin == 'Y') {
								if($.inArray(pipeline_id, pipelinesList) !== -1) {

									// Добавляем виджет в прав. колонку
									self.getTemplate('card-btns', function(data) {
										var params = {
											invoice_kp: self.id('', false) + '_invoice_kp',
											invoice: self.id('', false) + '_invoice',
											created_invoices: self.id('', false) + '_created_invoices',
											self: self
										};

										self.render_template({
											caption: {
												class_name: 'title-wrap'
											},
											body: '',
											render:	data.render(params)
										});
										
										$('.card-widgets__widget[data-code="' + self.params.widget_code + '"]').attr('id', self.params.widget_code).addClass('db-elmas-1C-card');
									});
								}
							// }
						}
					}
				}

				return true;
			},
			init: function () {
				/*
				if (typeof(AMOCRM.data.current_card) != 'undefined') {
					if (AMOCRM.data.current_card.id == 30186851) {
						self.updateTotalInvoices({
							currency_budget: 0,
							exchange_rate: 1,
							issued_invoices: 0,
							payed_invoices: 0,
							unpaid_invoices: 0,
							total_budget: 0,
							currency_budget: 0,
							
						});
					}
				}
				*/

				return true;
			},
			bind_actions: function () {		

				if(self.params.widget_active == 'Y') {
	            	// Billing module
					BillingModule.bind_actions();
       			}

       			// Создать счет по КП
       			$('body').off('click', self.id() + '_invoice_kp');
       			$('body').on('click', self.id() + '_invoice_kp', function() {
       				if($(this).hasClass('button-input-disabled')) {
       					return false;
       				}

       				self.openInvoiceKp($(this));
       			});

       			// Создать счет
       			$('body').off('click', self.id() + '_invoice');
       			$('body').on('click', self.id() + '_invoice', function() {
       				if($(this).hasClass('button-input-disabled')) {
       					return false;
       				}

       				self.openInvoice(null, null, $(this));
       			});

       			// Открыть созданые счета
       			$('body').off('click', self.id() + '_created_invoices');
       			$('body').on('click', self.id() + '_created_invoices', function() {
       				if($(this).hasClass('button-input-disabled')) {
       					return false;
       				}

       				self.openCreatedInvoices($(this));
       			});

       			// Редактировать счет
       			$('body').off('click', '.' + self.id('', false) + '_edit_invoice');
       			$('body').on('click', '.' + self.id('', false) + '_edit_invoice', function() {
       				var invoice_id = $(this).closest('tr').data('id');

       				self.openInvoice(invoice_id, null, $(this));
       			});

       			// Добавить позицию
       			$('body').off('click', self.id() + '_add_nomenclature');
       			$('body').on('click', self.id() + '_add_nomenclature', function() {
       				if(!$('.db-elmas-1C-nomenclature-list .control--suggest--list li').length) {
       					self.getNomenclatures($(this));
       				} else {
	       				$('.db-elmas-1C-nomenclature-list').slideToggle();

	       				if($(this).find('.button-input-inner__text').text().trim() == 'Добавить позицию') {
	       					$(this).find('.button-input-inner__text').html('<i class="fa fa-minus-circle" aria-hidden="true"></i> Скрыть список</span>');
	       				} else {
	       					$(this).find('.button-input-inner__text').html('<i class="fa fa-plus-circle" aria-hidden="true"></i> Добавить позицию</span>');
	       				}
       				}
       			});

       			// Добавить позицию
       			$('body').off('click', self.id() + '_add_nomenclature_to_table');
       			$('body').on('click', self.id() + '_add_nomenclature_to_table', function() {
       				self.addDefaultNomenclatureToInvoceTable();
       			});

       			// Выбор элемента из поиска
       			$('body').off('click', '.nomenclatures_list .control--suggest--list--item');
       			$('body').on('click', '.nomenclatures_list .control--suggest--list--item', function(e) {
       				var nomenclature_id = $(this).attr('data-value-id');

       				if(!$(this).hasClass('db-elmas-1C-nomenclature_title')) {
       					self.addNomenclature(nomenclature_id);
       				} else {
       					e.preventDefault();
       					e.stopPropagation();
       				}
       			});

       			// Выбор элемента из списка
       			$('body').off('click', '.db-elmas-1C-nomenclature-group-item');
       			$('body').on('click', '.db-elmas-1C-nomenclature-group-item', function(e) {
       				var nomenclature_id = $(this).attr('data-id');

       				self.addNomenclature(nomenclature_id);
       			});

       			// Показать/скрыть номенклатурные позиции списка
       			$('body').off('click', '.db-elmas-1C-nomenclature-group-title');
       			$('body').on('click', '.db-elmas-1C-nomenclature-group-title', function(){
       				$(this).next('.db-elmas-1C-nomenclature-group-items').slideToggle();
       			});

       			// Удалить позицию
       			$('body').off('click', '.db-elmas-1C-invoice_form .button-delete');
       			$('body').on('click', '.db-elmas-1C-invoice_form .button-delete', function() {
       				$(this).closest('tr[data-id]').remove();
       				
       				self.calculateCommonTotal();
       			});

       			// Записать счет
       			$('body').off('click', self.id() + '_record_invoice');
       			$('body').on('click', self.id() + '_record_invoice', function() {
       				self.recordInvoice($(this));
       			});

       			// Удалить счет
       			$('body').off('click', self.id() + '_remove_invoice');
       			$('body').on('click', self.id() + '_remove_invoice', function() {
       				self.removeInvoice($(this));
       			});

       			// Вычисление итоговой суммы и НДС
       			$('body').off('input', '.calculateCommonTotal');
       			$('body').on('input', '.calculateCommonTotal', function() {
       				self.calculateCommonTotal();
       			});

       			// Изменение организации
       			$('body').off('change', '.db-elmas-1C-invoice_form input[name=organization]');
       			$('body').on('change', '.db-elmas-1C-invoice_form input[name=organization]', function() {
       				var organization_id = $(this).val(),
       					contractor_id   = $('input[name="' + CF_ID + '"]').length ? $('input[name="' + CF_ID + '"]').val() : null,
       					contractor_inn  = $('input[name="' + CF_INN + '"]').length ? $('input[name="' + CF_INN + '"]').val() : null;

       				self.getBankAccounts(organization_id);

       				self.getContracts(contractor_id, contractor_inn, organization_id);
       			});

       			// Изменение организации/банковского счета
       			$('body').off('change', '.db-elmas-1C-invoice_form input[name=organization], .db-elmas-1C-invoice_form input[name=bank_account]');
       			$('body').on('change', '.db-elmas-1C-invoice_form input[name=organization], .db-elmas-1C-invoice_form input[name=bank_account]', function() {
       				self.invoiceFormChanged = true;
       			});

       			// Изменение договора
       			$('body').off('click', '.db-elmas-1C-invoice_form .control--suggest--list--item');
       			$('body').on('click', '.db-elmas-1C-invoice_form .control--suggest--list--item', function() {
       				self.invoiceFormChanged = true;
       			});


       			// Создать счет
       			$('body').off('click', '.' + self.id('', false) + '_create_invoice');
       			$('body').on('click', '.' + self.id('', false) + '_create_invoice', function(e) {
       				e.preventDefault();

       				var invoice_id = $(this).closest('tr').data('id'),
       					kp = {
       						type: $(this).closest('tr').data('kp-type'),
       						id: $(this).closest('tr').data('kp-id'),
       						product_name: $(this).closest('tr').data('product-name'),
       						phase: $(this).closest('tr').data('phase'),
       						price: $(this).closest('tr').find('input[name=invoice_sum]').val()
       					};

       				if(typeof invoice_id === 'undefined' || invoice_id == '') {
				 		invoice_id = null;
				 	}

				 	if(typeof kp.type === 'undefined' || kp.type == '') {
				 		kp.type = null;
				 	}

				 	if(typeof kp.id === 'undefined' || kp.id == '') {
				 		kp.id = null;
				 	}

				 	if(typeof kp.product_name === 'undefined' || kp.product_name == '') {
				 		kp.product_name = null;
				 	}

				 	if(typeof kp.phase === 'undefined' || kp.phase == '') {
				 		kp.phase = null;
				 	}

       				self.openInvoice(invoice_id, kp, $(this));
       			});

       			// Скачать счет DOC
       			$('body').off('click', '.' + self.id('', false) + '_download_invoice');
       			$('body').on('click', '.' + self.id('', false) + '_download_invoice', function(e) {
       				e.preventDefault();

       				let invoice_id = $(this).closest('tr[data-id]').attr('data-id'),
       					type = $(this).data('type');

       				if($(this).hasClass('button-input-disabled') || typeof invoice_id === 'undefined' || invoice_id == '') {
       					return false;
       				}

       				let link = document.createElement('a');
       				link.setAttribute('download','download');
			        link.setAttribute('target','_blank');


			        let linkHref = 'http://212.8.235.40:88/Acc-2016/hs/amo_api/bills/printing_form?idbill=' + invoice_id;
			        if(type === 'doc') linkHref += '&type_doc=doc';
			       
   				 	self.openConfirmModal({
                    	callbacks: {
	                        accept: function() {
	                            console.log('Русский');
	                            
	                            linkHref += '&lang=rus';                      
	                            link.setAttribute('href', linkHref);
	                            link.click();
	                        },
	                        destroy: function() {
	                        	console.log('Английский');

	                        	linkHref += '&lang=eng';
	                        	link.setAttribute('href', linkHref);
	                        	link.click();
	                        }
	                    },
	                    messages: {
	                        decline_text: 'Английский',
	                        accept_text: 'Русский',
	                        text: 'На каком языке сформировать счет?'
	                    }
	                });
       			});

       			// Изменение названия компании
       			$('body').off('input', '#new_company_form input[name="company[NAME]"], #companies_list input[name="contact[NAME]"], #person_n[name="contact[NAME]"]');
       			$('body').on('input', '#new_company_form input[name="company[NAME]"], #companies_list input[name="contact[NAME]"], #person_n[name="contact[NAME]"]', function() {
       				if(typeof self.COMNAME_DEFAULT_VAL !== 'undefined') {
       					if($(this).val() != self.COMNAME_DEFAULT_VAL) {
       						self.changeCompanyName($(this));
       					} else {
       						if(self.CF_INN_ERROR == false) {
								btn.removeClass('db-elmas-1C-input-hidden');
								field.removeClass('db-elmas-1C-input_error');

								self.COMNAME_ERROR = false;
							}
       					}
       				}
       			});

       			// Изменение ИНН компании
       			$('body').off('input', 'input[name="' + CF_INN + '"]');
       			$('body').on('input', 'input[name="' + CF_INN + '"]', function() {
       				if(typeof self.CF_INN_DEFAULT_VAL !== 'undefined') {
       					if($(this).val() != self.CF_INN_DEFAULT_VAL) {
       						self.changeCompanyINN($(this));
       					} else {
       						if(self.COMNAME_ERROR == false) {
								btn.removeClass('db-elmas-1C-input-hidden');
								field.removeClass('db-elmas-1C-input_error');

								self.CF_INN_ERROR = false;
							}
       					}
       				}
       			});

				// Сохранить сопоставление пользователей
       			$('body').off('click', self.id() + '_save_users');
    			$('body').on('click', self.id() + '_save_users', function() {
    				self.saveSettingsUsers($(this));
    			});

    			// Сохранить реестра счетов
       			$('body').off('click', self.id() + '_save_sheets');
    			$('body').on('click', self.id() + '_save_sheets', function() {
    				self.saveSettingsSheets($(this));
    			});

    			// Открыть реестра счетов
       			$('body').off('click', self.id() + '_open_sheet');
    			$('body').on('click', self.id() + '_open_sheet', function() {
    				var link = document.createElement('a'),
    					sheets_id = $(this).closest('.form-group__control').find('input[name=organization_link]').val();

    				if(sheets_id == '') {
    					self.openAlert('Укажите идентификатор таблицы', 'error');

    					return false;
    				}

			        link.setAttribute('href','https://docs.google.com/spreadsheets/d/' + sheets_id);
			        link.setAttribute('target','_blank');
			        link.click();
    			});
			  	
			  	// Изменение сервера
       			$('body').off('change', 'input[name=server_type]');
       			$('body').on('change', 'input[name=server_type]', function() {
       				$('#elmas_1c_custom_content input[name=server]').val(JSON.stringify({"id": $('input[name=server_type]:checked').val(), "value": $('input[name=server_type]:checked').data('value')})).trigger('change');
       			});


				return true;
			},
			settings: function () {

				self.appendCss();

            	var is_admin = AMOCRM.constant('managers')[AMOCRM.constant('user').id].is_admin;
            	
                const $modal   = $('.widget-settings__modal.' + self.params.widget_code);
                const $install = $modal.find('button.js-widget-install');
                const $save    = $modal.find('button.js-widget-save');
                const $uninstall = $modal.find('button.js-widget-uninstall');

                $modal.attr('id', self.id('', false)).addClass('db-elmas-1C-settings');

                // Автозаполнение настроек
				if($modal.find('input[name="account"]').val() == '') {
					$modal.find('input[name="account"]').val(AMOCRM.constant('account').subdomain);
				}

				if(is_admin == 'Y') {
					if($modal.find('input[name="login"]').val() == '') {
						$modal.find('input[name="login"]').val(AMOCRM.constant('user').login);
					}
					
					if($modal.find('input[name="api_key"]').val() == '') {
						$modal.find('input[name="api_key"]').val(AMOCRM.constant('user').api_key);
					}
				}

                // add tabs-nav
                if(!$install.length) {
                	self.addTabs($modal);
				}

				/*
                // add description
				self.getTemplate('description', function(data){
					var params = {
						buy_button_id: self.id('', false) + '_buy_widget_btn',
						base_path : self.params.path,
						self: self
					};

					$modal.find('.widget_settings_block__descr').append(data.render(params));
				});
				*/

				$modal.find('.widget_settings_block__descr').hide();

				// add server settings
				self.getTemplate('settings-servers', function(data){
					$modal.find('#widget_settings__fields_wrapper').prepend(data.render({self: self}));

					// Set urlAPI
					if(typeof self.get_settings().server == 'object') {
						$modal.find('input[name=server_type][data-value="' + self.get_settings().server.value + '"]').prop('checked', true);
					} else {
						$modal.find('input[name=server_type][data-value="' + $.parseJSON(self.get_settings().server).value + '"]').prop('checked', true);
					}
				});
							
				// add confirm
				self.getTemplate('confirm', function(data){

					 var params = {
	                	text: 'Я даю согласие на передачу данных из аккаунта amoCRM (аккаунт, логин, API ключ)',
						id: self.id('', false) + '_confirm',
						self: self
					};

					$modal.find('.widget_settings_block__fields .widget_settings_block__item_field:nth-child(4)').after(data.render(params));
				});

                // add footer
				self.getTemplate('footer', function(data){

					var params = {
					 	title: 'По вопросам работы виджета обращайтесь:',
	                	site: 'digitalbis.ru',
	                	source: 'marketplace_amo',
	                	phone: '+7 499 647 43 37',
						email: 'hi@digitalbis.ru'
					};

					$modal.find('.widget-settings__desc-space').append(data.render(params));
				});

                return true;
			},
			onSave: function() {
                return true;
            },
            destroy: function() {
            }
	    };
   		
   		return this;
	};
  	
  	return CustomWidget;
});