Current Path : /var/www/axolotl/data/www/axolotls.ru/www/bitrix/js/sale/b24integration/src/ |
Current File : /var/www/axolotl/data/www/axolotls.ru/www/bitrix/js/sale/b24integration/src/stepper.js |
export class Stepper { constructor(props = {}) { this.ownerId = !!props.ownerId ? props.ownerId:0; this.ownerTypeId = !!props.ownerTypeId ? props.ownerTypeId:0; } progress(list, total = 0, start = 0) { if (!list || list.length <= 0) { throw new Error('list must be defined'); } Stepper.isSuccess = true; this.batchFetch(list, total, start) .then( batch => { this.activityAdds(batch) .then( () => this.clientAdds(batch) .then( () => this.dealUpdateContacts(this.ownerId, batch) .then( () => Stepper.getFulfillPromise(), () => {throw new Error('batchFetch dealUpdateContacts Error')}), () => {throw new Error('batchFetch clientAdds Error')}), (activity) => this.continueProcess(activity))// reject to call progress again .then( () => this.nextBatch(batch) .then( ()=>{}, ()=>Stepper.labelFinish(batch)), () => {throw new Error('progress Error')})}, () => {throw new Error('batchFetch Error')} ); } continueProcess(response) { let errors = !!response.errors ? response.errors:{}; if(Object.values(errors).length>0) { throw new Error('continueProcess Error') } else { return Stepper.getFulfillPromise() } } batchFetch(list, total, start) { return BX.ajax.runAction('sale.integration.stepper.activityBatch', { data: { list: list, total: total, start: start }}) } activityAdds(response) { let data = !!response.data ? response.data:{}; Stepper.progressBar(data); Stepper.messageBar(data); if(!!data.process) { /* * Object.values(data.process.items).length = n && Object.values(data.process.list).length = 0 //start - one step * Object.values(data.process.items).length = 0 && Object.values(data.process.list).length = n // skip step * * */ // if(Object.values(data.process.items).length>0) { return BX.ajax.runAction('sale.integration.scenarios.activityAddsFromOrderList', {data: {params: data.process.items}}); } else if(Object.values(data.process.list).length>0) { return Stepper.getRejectPromise(); } else if(!!data.error && data.error.length>0) { // продолжаем выполнение, т.к. текст ошибки на данном шаге выведен. пропускаем шаг return Stepper.getRejectPromise(); } } throw new Error('activityAdds Error') } prepareContactFields(response) { if(!!response.status && response.status === 'success') { let data = !!response.data ? response.data:{}; if(!!data.process && Object.values(data.process.items).length>0) { return BX.ajax.runAction('sale.integration.scenarios.resolveContactFieldsValuesFromOrderList', {data: {params: data.process.items}}) } } throw new Error('clientAdds Error') } clientAdds(batch) { return this.prepareContactFields(batch) //->из исходных данных получили список по локальным пользователям .then( list => this.contactRelationVoid(list) //->возвращает локальный список пользователей у которых связь с удаленной сущностью отсутвует/не корректна .then( addList => this.contactAdds(addList) //->добавили контакты в удаленную сиситему, обновили связи на локальной. с этого момента для пользователей из batch локально храниться актальная таблица связок к удаленным сущностям .then( () => Stepper.getFulfillPromise(), () => {throw new Error('clientAdds contactAdds Error')}), () => {throw new Error('clientAdds contactRelationVoid Error')}), () => {throw new Error('clientAdds prepareContactFields Error')} ); } contactRelationVoid(list) { if(!!list.status && list.status === 'success') { let data = !!list.data ? list.data:{}; //если данных нет пропускаем вызов и возвращаем fulfill promise if(!!data.result && Object.values(data.result).length>0) { return BX.ajax.runAction('sale.integration.scenarios.resolveUserTypeIAfterComparingRemotelyRelationFromOrderList', {data: {params: data.result}}) } else { return Stepper.getFulfillPromise(list) } } throw new Error('contactRelationVoid Error') } contactAdds(addList) { if(!!addList.status && addList.status === 'success') { let data = !!addList.data ? addList.data:{}; //если данных нет пропускаем вызов и возвращаем fulfill promise if(!!data.result && Object.values(data.result).length>0) { return BX.ajax.runAction('sale.integration.scenarios.contactAddsFromOrderList', {data: {params: data.result}}) } else { return Stepper.getFulfillPromise() } } throw new Error('contactAdds Error') } dealUpdateContacts(dealId, batch) { return this.prepareContactFields(batch) //->из исходных данных получили список по локальным пользователям .then( (list) => this.dealContactItemsUpdate(dealId, list), //->обновляем пользоватлей в сделке (обогощаем сделку контактами) () => {throw new Error('dealUpdateContacts prepareContactFields Error')}); } dealContactItemsUpdate(dealId, list) { if(!!list.status && list.status === 'success') { let data = !!list.data ? list.data:{}; //если данных нет пропускаем вызов и возвращаем fulfill promise // (например когда в заказе указана компания, а запрашиваются данные клинта-Контакта) if(!!data.result && Object.values(data.result).length>0) { return this.dealContactItemsGet(dealId) .then( (items)=>this.dealContactAdds(dealId, {list:list, items:items}), () => {throw new Error('dealUpdateContacts dealContactAdds Error')}) } else { return Stepper.getFulfillPromise() } } throw new Error('dealUpdateContacts dealContactItemsUpdate Error') } dealContactAdds(dealId, params) { // метод должен вызываться когда гарантровано есть список пльзоватлей из БУС для обогощения сделки // если у сделки есть контакты, то обогощаем их пользователями // если у сделки нет контактов добавляем всех пользователей let users = !!params.list ? params.list:{}; let contacts = !!params.items ? params.items:{}; if(!!users.status && users.status === 'success' && !!contacts.status && contacts.status === 'success') { let dataUsers = !!users.data ? users.data:{}; let dataContacts = !!contacts.data ? contacts.data:{}; if(!!dataUsers.result && !!dataContacts.result) { if(Object.values(dataContacts.result).length>0) { return BX.ajax.runAction('sale.integration.scenarios.dealContactUpdates', {data: {id: dealId, items: dataUsers.result, contacts: dataContacts.result}}) } else { return BX.ajax.runAction('sale.integration.scenarios.dealContactAdds', {data: {id: dealId, items: dataUsers.result}}) } } } throw new Error('dealContactAdds Error') } dealContactItemsGet(dealId) { return BX.ajax.runAction('sale.integration.scenarios.dealContactItemsGet', {data: {id: dealId}}) } dealUpdate(response) { if(!!response.status && response.status === 'success') { let data = !!response.data ? response.data:{}; if(!!data.process && data.process.items.length>0) { return BX.ajax.runAction('sale.integration.scenarios.dealupdatecontacts', {data: {id:this.ownerId, params: data.process.items}}) } } throw new Error('dealUpdate Error') } nextBatch(response) { if(!!response.status && response.status === 'success') { let data = !!response.data ? response.data:{}; if(!!data.process && !!data.process.list && !!data.process.items && !!data.process.total && !!data.process.start) { if (Object.values(data.process.items).length > 0 && Object.values(data.process.list).length > 0) { this.progress(data.process.list, data.process.total, data.process.start); return Stepper.getFulfillPromise(); } if (Object.values(data.process.items).length === 0 && Object.values(data.process.list).length > 0) { this.progress(data.process.list, data.process.total, data.process.start); return Stepper.getFulfillPromise(); } else if(Object.values(data.process.list).length <= 0) { // finish process batch return Stepper.getRejectPromise(); } } } throw new Error('nextBatch Error') } static progressBar(data) { if(!!data.progress) { BX.ajax.runAction('sale.integration.stepper.progressbar', {data:{value: data.progress}}) .then( response => Stepper.render('progress', response.data), () => {throw new Error('ProgressBar failure!')} ); } } static labelFinish(response) { let data = !!response.data ? response.data:{}; if(!!data.finish) { //BX.closeWait(); BX.ajax.runAction('sale.integration.stepper.messageOK', {}) .then( response => { Stepper.render('finish', response.data); if(Stepper.isSuccess) { Stepper.closeApplication()}}, () => {throw new Error('MessagebyType OK failure!')} ); } } static messageBar(data) { if (!!data.error) { Stepper.isSuccess = false; BX.ajax.runAction('sale.integration.stepper.messagebytype', { data: { message: data.error, type: 'ERROR' }}) .then( response => { let div = BX.create('DIV'); div.innerHTML = response.data; BX('progress_error').appendChild(div); }, () => {throw new Error('MessagebyType ERROR failure!')} ); } } static render(element, result) { BX.adjust(BX(element), {html: result}); } static getFulfillPromise(params={}) { let promise = new BX.Promise(); promise.fulfill(params); return promise; } static getFulfillPromise_setTimeout() { let promise = new BX.Promise(); setTimeout(() => { promise.fulfill(this); }, 2000); return promise; } static getRejectPromise() { let promise = new BX.Promise(); promise.reject(this); return promise; } static closeApplication() { setTimeout(() => { BX24.closeApplication(); }, 500); } }