Created
January 14, 2016 13:08
-
-
Save wmakeev/e5f013a8d83ca6108780 to your computer and use it in GitHub Desktop.
Замена товаров по истории документов
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* good-replace | |
* | |
* Copyright (c) 2015, Vitaliy Makeev | |
* Licensed under MIT. | |
*/ | |
'use strict' | |
import csp, { chan, CLOSED } from 'js-csp' | |
import _r from 'underam' | |
import { take, put } from 'js-csp-async' | |
import moysklad, { tools } from 'moysklad' | |
// Трансформация заказов-заданий в необходимый вид | |
// для удбства поиска подменяемых позиций | |
let replaceMapTransform = _r() | |
.map(order => order.positions) | |
// В заказе-задании должно быть четное кол-во позиций | |
.filter(positions => positions && positions.length % 2 === 0) | |
.cat().partitionAll(2) | |
.map(positions => [ | |
positions[0].product.id, | |
positions[1].product.id | |
]) | |
.compose() | |
async function processDocs () { | |
let client = moysklad.createCspClient() | |
// Получение заказов с заданиями | |
let replaceMap = await client.customerOrder | |
.filter('agent.id', process.env.API_AGENT_ID) | |
.into({}, replaceMapTransform) | |
if (!Object.keys(replaceMap).length) { | |
console.log('Задания для замены позиций не найдены') | |
return | |
} | |
client.operationWithPositions | |
.filter('updated', { $gt: process.env.LAST_UPDATED }) | |
.expand('positions') | |
.toChain() | |
.filter(o => o.positions && o.positions.length) | |
.flatMap(o => { | |
let positionsUpdated = 0 | |
let positions = o.positions.map(pos => { | |
let replaceTo = replaceMap[position.product.id] | |
if (replaceTo) { | |
positionsUpdated++ | |
return { | |
...pos, | |
id: null, | |
product: replaceTo | |
} | |
} else { | |
return pos | |
} | |
}) | |
if (positionsUpdated) { | |
return [{ updated: positionsUpdated, doc: { ...o, positions } }] | |
} else { | |
return [] | |
} | |
}) | |
.tap(info => console.log( | |
`В документе ${info.doc.name} обновлено ${info.updated} позиций`)) | |
.map(info => info.doc) | |
// TODO Много вопросов о том как сохранять объекты | |
.map(o => ({ | |
type: o.type, | |
id: o.id, | |
positions: o.positions | |
})) | |
// Отправляем обновленные документы обратно на сервис | |
.pipe(client.save({ maxPayloadLength: 5000, timeout: 5000 })) | |
} | |
// Запускаем процесс обработки | |
processDocs() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment