Вы мыслите в правильном русле.... но все еще далеко от совершенства.
каждое действие должно делаться в одном методе (функции для PHP)
Ваш код должен повторять логику алогритма или блок схемы, и там где присутствуют переменные, все выносить в переменные класса по возможности..
<?php
// хендлер реализаций
class WaybillHandler
{
protected $debug = true;
protected $db = null;
protected $socket = array();
protected $structure= array();
protected $doc = null;
protected $crmData = array();
public function __construct($waybill)
{
$this->db = DBPool::me()->getLink();
$this->doc = $waybill;
self::Handler();
}
private function Handler()
{
$db = $this->db;
// Если реализация не привязана к счету, то ничего не делаем
if ($this->doc['ДокументОснование']['#type'] != 'jcfg:DocumentRef.СчетНаОплатуПокупателю') {
return;
}
$this->structure = Utils1c::prepareStructure($this->doc,'waybill');
// Усли реализация поставлена на удаление, то автоматически будет отменена проводка
// либо мы вручную убрали проводку, а значит мы должны удалить запись из CRM
if ($this->doc['Posted'] == false) {
$this->structure['debug'][] = "Реализация не проведена, делаем попытку удаление данных"." (".__LINE__.")";
self::deleteWaybillFromCRM();
} else {
if (self::isRelatedToOurInvoice()) {
self::findDataFromCRMforWaybill();
if (count($this->crmData)) {
self::deleteWaybillDataOnDeleteInERP();
self::insertMissingWaybillDataToERP();
self::compareWaybillDataBetweenCRMandERP();
} else {
self::insertWaybillDataOnNewRowInERP();
}
self::updateStructureFinally();
} else {
$this->structure['debug'][] = "Мы не нашли связь между этой реализацией и счетами в CRM"." (".__LINE__.")";
}
}
if (!$this->debug) {
$this->structure['debug'] = array();
}
$this->socket[] = Driver1c::SOCKET_MARKER.json_encode($this->structure, JSON_UNESCAPED_UNICODE);
new WebSocketClient($this->socket);
return;
}
}