Skip to content

Instantly share code, notes, and snippets.

@wmakeev
Created January 14, 2016 13:08
Show Gist options
  • Save wmakeev/e5f013a8d83ca6108780 to your computer and use it in GitHub Desktop.
Save wmakeev/e5f013a8d83ca6108780 to your computer and use it in GitHub Desktop.
Замена товаров по истории документов
/*
* 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