Bitrix-D7  20.5.0
Класс CheckManager

Открытые статические члены

static addByType (array $entities, $type, array $relatedEntities=array())
 
static isAvailableCorrection ()
 
static addCorrection ($type, $cashboxId, array $correction)
 
static savePrintResult ($checkId, array $data)
 
static delete ($id)
 
static addChecks (array $entities)
 
static getOrder ($entity)
 
static init ()
 
static getCheckList ()
 
static getSalesCheckList ()
 
static getCheckTypeMap ()
 
static createByType ($type)
 
static collateDocuments (array $entities)
 
static getPrintableChecks (array $cashboxIds, array $orderIds=array())
 
static create (array $settings)
 
static getCheckInfo (Sale\Internals\CollectableEntity $entity)
 
static getLastPrintableCheckInfo (Sale\Internals\CollectableEntity $entity)
 
static collectInfo (array $filter=array())
 
static getCheckInfoByExternalUuid ($uuid)
 
static getObjectById ($id)
 
static getList (array $parameters=array())
 
static getRelatedEntitiesForPayment ($checkType, $paymentId, $registryType=Sale\Registry::REGISTRY_TYPE_ORDER)
 
static getRelatedEntitiesForShipment ($checkType, $shipmentId, $registryType=Sale\Registry::REGISTRY_TYPE_ORDER)
 

Поля данных

const EVENT_ON_GET_CUSTOM_CHECK = 'OnGetCustomCheckList'
 
const EVENT_ON_CHECK_PRINT_SEND = 'OnPrintableCheckSend'
 
const EVENT_ON_BEFORE_CHECK_ADD_VERIFY = 'OnBeforeCheckAddVerify'
 
const EVENT_ON_CHECK_PRINT_ERROR = 'OnCheckPrintError'
 
const MIN_TIME_FOR_SWITCH_CASHBOX = 240
 
const CHECK_RESENDING_TIME = 4
 This is time re-sending a check print in minutes. Подробнее...
 
const CHECK_LIMIT_RECORDS = 5
 

Подробное описание

См. определение в файле checkmanager.php строка 23

Методы

◆ addByType()

static addByType ( array  $entities,
  $type,
array  $relatedEntities = array() 
)
static
Аргументы
CollectableEntity[]$entities
$type
CollectableEntity[]$relatedEntities
Возвращает
Result

См. определение в файле checkmanager.php строка 41

42  {
43  $result = new Result();
44 
45  if ($type === '')
46  {
47  $result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_EMPTY_CHECK_TYPE')));
48  return $result;
49  }
50 
51  $check = static::createByType($type);
52  if (!$check instanceof Check)
53  {
54  $result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK')));
55  return $result;
56  }
57 
58  $cashboxList = array();
59  $firstIteration = true;
60  foreach ($entities as $entity)
61  {
62  $items = Manager::getListWithRestrictions($entity);
63  if ($firstIteration)
64  {
65  $cashboxList = $items;
66  $firstIteration = false;
67  }
68  else
69  {
70  $cashboxList = array_intersect_assoc($items, $cashboxList);
71  }
72  }
73 
74  $entity = reset($entities);
75  $order = static::getOrder($entity);
76 
77  if (!$cashboxList)
78  {
79  $dbRes = CashboxTable::getList(array('filter' => array('ACTIVE' => 'Y')));
80  if ($dbRes->fetch())
81  $result->addError(new Error(Loc::getMessage('SALE_CASHBOX_NOT_FOUND')));
82 
83  return $result;
84  }
85 
86  $check->setEntities($entities);
87  $check->setRelatedEntities($relatedEntities);
88  $check->setAvailableCashbox($cashboxList);
89 
90  $validateResult = $check->validate();
91  if (!$validateResult->isSuccess())
92  {
93  $result->addErrors($validateResult->getErrors());
94  return $result;
95  }
96 
97  $saveResult = $check->save();
98  if ($saveResult->isSuccess())
99  {
100  $checkId = $saveResult->getId();
101  $order->addPrintedCheck($check);
102 
103  $enabledImmediateCashboxList = array();
104  foreach ($cashboxList as $item)
105  {
106  if ($item['ENABLED'] === 'Y')
107  {
108  $cashbox = Cashbox::create($item);
109  if ($cashbox instanceof IPrintImmediately)
110  {
111  $enabledImmediateCashboxList[$item['ID']] = $cashbox;
112  }
113  }
114  }
115 
116  if ($enabledImmediateCashboxList)
117  {
118  $cashboxId = Manager::chooseCashbox(array_keys($enabledImmediateCashboxList));
119  /** @var Cashbox|IPrintImmediately $cashbox */
120  $cashbox = $enabledImmediateCashboxList[$cashboxId];
121 
123  $checkId,
124  array(
125  'STATUS' => 'P',
126  'DATE_PRINT_START' => new Type\DateTime(),
127  'CASHBOX_ID' => $cashbox->getField('ID')
128  )
129  );
130 
131  $printResult = $cashbox->printImmediately($check);
132  if ($printResult->isSuccess())
133  {
134  $data = $printResult->getData();
135  CashboxCheckTable::update($checkId, ['EXTERNAL_UUID' => $data['UUID']]);
136  }
137  else
138  {
139  static::savePrintResult(
140  $checkId,
141  [
142  'ID' => $checkId,
143  'ERROR' => [
144  'TYPE' => Errors\Error::TYPE,
145  'MESSAGE' => implode("\n", $printResult->getErrorMessages())
146  ]
147  ]
148  );
149  }
150 
151  $result->setId($checkId);
152 
153  return $result;
154  }
155 
156  global $CACHE_MANAGER;
157  foreach ($cashboxList as $cashbox)
158  {
159  $CACHE_MANAGER->Read(CACHED_b_sale_order, 'sale_checks_'.$cashbox['ID']);
160  $CACHE_MANAGER->SetImmediate('sale_checks_'.$cashbox['ID'], true);
161  }
162  }
163  else
164  {
165  $result->addErrors($saveResult->getErrors());
166  }
167 
168  return $result;
169  }
static getMessage($code, $replace=null, $language=null)
Returns translation by message code.
Definition: loc.php:29
static getList(array $parameters=array())
Executes the query and returns selection by parameters of the query.
static update($primary, array $data)
Updates row in entity table by primary key.
static create(array $settings)
Definition: cashbox.php:118
static getListWithRestrictions(CollectableEntity $entity)
trait Error
\IErrorable

◆ addChecks()

static addChecks ( array  $entities)
static
Аргументы
CollectableEntity[]$entities
Возвращает
Result

См. определение в файле checkmanager.php строка 532

533  {
534  $result = new Result();
535 
536  $map = static::collateDocuments($entities);
537  foreach ($map as $check)
538  {
539  $isCorrect = true;
540 
541  $event = new Main\Event('sale', static::EVENT_ON_BEFORE_CHECK_ADD_VERIFY, array($check));
542  $event->send();
543 
544  if ($event->getResults())
545  {
546  /** @var Main\EventResult $eventResult */
547  foreach ($event->getResults() as $eventResult)
548  {
549  if ($eventResult->getType() !== Main\EventResult::ERROR)
550  {
551  $isCorrect = (bool)$eventResult->getParameters();
552  }
553  }
554  }
555 
556  if ($isCorrect)
557  {
558  $addResult = static::addByType($check["ENTITIES"], $check["TYPE"], $check["RELATED_ENTITIES"]);
559  if (!$addResult->isSuccess())
560  $result->addErrors($addResult->getErrors());
561  }
562  }
563 
564  return $result;
565  }

◆ addCorrection()

static addCorrection (   $type,
  $cashboxId,
array  $correction 
)
static

См. определение в файле checkmanager.php строка 193

194  {
195  $result = new Result();
196 
197  if (!self::isAvailableCorrection())
198  {
199  return $result->addError(
200  new Error(
201  Loc::getMessage('SALE_CASHBOX_CHECK_CORRECTION_NOT_AVAILABLE')
202  )
203  );
204  }
205 
206  /** @var CorrectionCheck $check */
207  $check = static::createByType($type);
208  if (!$check instanceof CorrectionCheck)
209  {
210  $result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK')));
211  return $result;
212  }
213 
214  $check->setField('CASHBOX_ID', $cashboxId);
215  $check->setAvailableCashbox([
216  Manager::getCashboxFromCache($cashboxId)
217  ]);
218 
219  $check->setCorrectionFields($correction);
220 
221  $r = $check->save();
222  if ($r->isSuccess())
223  {
224  $result->setId($check->getField('ID'));
225 
226  $cashbox = Manager::getObjectById($cashboxId);
227  if ($cashbox instanceof ICorrection)
228  {
230  $check->getField('ID'),
231  [
232  'STATUS' => 'P', 'DATE_PRINT_START' => new Type\DateTime()
233  ]
234  );
235 
236  $printResult = $cashbox->printCorrectionImmediately($check);
237  if ($printResult->isSuccess())
238  {
239  $data = $printResult->getData();
240  CashboxCheckTable::update($check->getField('ID'), ['EXTERNAL_UUID' => $data['UUID']]);
241  }
242  else
243  {
244  static::savePrintResult(
245  $check->getField('ID'),
246  [
247  'ID' => $check->getField('ID'),
248  'ERROR' => [
249  'TYPE' => Errors\Error::TYPE,
250  'MESSAGE' => implode("\n", $printResult->getErrorMessages())
251  ]
252  ]
253  );
254  }
255 
256  global $CACHE_MANAGER;
257  $CACHE_MANAGER->Read(CACHED_b_sale_order, 'sale_checks_'.$cashboxId);
258  $CACHE_MANAGER->SetImmediate('sale_checks_'.$cashboxId, true);
259  }
260  }
261  else
262  {
263  $result->addErrors($r->getErrors());
264  }
265 
266  return $result;
267  }

◆ collateDocuments()

static collateDocuments ( array  $entities)
static
Аргументы
array$entities
Возвращает
Entity[]
Исключения
Main

См. определение в файле checkmanager.php строка 747

748  {
749  $map = [];
750 
751  $event = new Main\Event('sale', 'OnCheckCollateDocuments', [
752  'ENTITIES' => $entities
753  ]);
754  $event->send();
755  $eventResults = $event->getResults();
756  if ($eventResults != null)
757  {
758  foreach ($eventResults as $eventResult)
759  {
760  if ($eventResult->getType() === Main\EventResult::SUCCESS)
761  {
762  $d = $eventResult->getParameters();
763  if (!is_array($d))
764  throw new Main\NotSupportedException("OnCheckCollateDocuments event result");
765 
766  $map = array_merge($map, $d);
767  }
768  else if ($eventResult->getType() === Main\EventResult::ERROR)
769  {
770  return $map;
771  }
772  }
773 
774  if (count($map) > 0)
775  {
776  return $map;
777  }
778  }
779 
780  $existingChecks = null;
781  $order = null;
782 
783  /** @var Sale\Payment|Sale\Shipment $entity */
784  foreach ($entities as $entity)
785  {
786  // load existing checks
787  if ($existingChecks === null)
788  {
789  $existingChecks = [];
790  $order = static::getOrder($entity);
791 
792  $filter = [
793  'ORDER_ID' => $order->getId(),
794  'ENTITY_REGISTRY_TYPE' => $entity::getRegistryType()
795  ];
796  if ($entity instanceof Sale\Payment)
797  {
798  $filter["PAYMENT_ID"] = $entity->getId();
799  }
800  elseif ($entity instanceof Sale\Shipment)
801  {
802  $filter["SHIPMENT_ID"] = $entity->getId();
803  }
804 
805  $db = static::getList([
806  "filter" => $filter,
807  "select" => ["ID", "PAYMENT_ID", "SHIPMENT_ID", "TYPE", "STATUS"]
808  ]);
809  while ($ar = $db->fetch())
810  {
811  if (intval($ar["PAYMENT_ID"]) > 0)
812  {
813  $existingChecks["P"][ $ar["PAYMENT_ID"] ][] = $ar;
814  }
815 
816  if (intval($ar["SHIPMENT_ID"]) > 0)
817  {
818  $existingChecks["S"][ $ar["SHIPMENT_ID"] ][] = $ar;
819  }
820  }
821  }
822 
823  // analysing
824  // we should allow users to implement their own algorithms
825  if (count($existingChecks) <= 0)
826  {
827  if (static::isAutomaticEnabled($order))
828  {
830  {
831  $result = static::collateWithFFD105($entity);
832  }
833  else
834  {
835  $result = static::collate($entity);
836  }
837 
838  if ($result)
839  {
840  $map = array_merge($map, $result);
841  }
842  }
843  }
844  }
845 
846  return $map;
847  }
Class RestHandler \Handlers\PaySystem.

◆ collectInfo()

static collectInfo ( array  $filter = array())
static
Аргументы
array$filter
Возвращает
array
Исключения
Main

См. определение в файле checkmanager.php строка 1309

1310  {
1311  $result = array();
1312 
1313  $typeMap = CheckManager::getCheckTypeMap();
1314 
1315  $dbRes = static::getList(
1316  array(
1317  'select' => array('*'),
1318  'filter' => $filter
1319  )
1320  );
1321 
1322  while ($data = $dbRes->fetch())
1323  {
1324  $data['LINK'] = '';
1325  if (!empty($data['LINK_PARAMS']))
1326  {
1327  $cashbox = Manager::getObjectById($data['CASHBOX_ID']);
1328  if ($cashbox)
1329  {
1330  $data['LINK'] = $cashbox->getCheckLink($data['LINK_PARAMS']);
1331  }
1332  }
1333 
1334  /** @var Check $type */
1335  $type = $typeMap[$data['TYPE']];
1336  if (class_exists($type))
1337  {
1338  $data['TYPE_NAME'] = $type::getName();
1339  }
1340 
1341  $result[$data['ID']] = $data;
1342  }
1343 
1344  return $result;
1345  }

◆ create()

static create ( array  $settings)
static
Аргументы
array$settings
Возвращает
Check|null

См. определение в файле checkmanager.php строка 1214

1215  {
1216  $check = CheckManager::createByType($settings['TYPE']);
1217  if ($check)
1218  $check->init($settings);
1219 
1220  return $check;
1221  }

◆ createByType()

static createByType (   $type)
static
Аргументы
string$type
Возвращает
null|Check

См. определение в файле checkmanager.php строка 732

733  {
734  static::init();
735 
736  $typeMap = static::getCheckTypeMap();
737  $handler = $typeMap[$type];
738 
739  return Check::create($handler);
740  }

◆ delete()

static delete (   $id)
static
Аргументы
$id
Исключения
Main

См. определение в файле checkmanager.php строка 512

513  {
514  $r = CashboxCheckTable::delete($id);
515  if ($r->isSuccess())
516  {
518  ->addSelect('ID')
519  ->where('CHECK_ID', $id);
520 
521  while ($link = $dbRes->fetchObject())
522  {
523  $link->delete();
524  }
525  }
526  }
static query()
Creates and returns the Query object for the entity.
static delete($primary)
Deletes row in entity table by primary key.

◆ getCheckInfo()

static getCheckInfo ( Sale\Internals\CollectableEntity  $entity)
static
Аргументы
CollectableEntity$entity
Возвращает
array
Исключения
Main

См. определение в файле checkmanager.php строка 1229

1230  {
1231  $filter = array();
1232  if ($entity->getId() > 0)
1233  {
1234  if ($entity instanceof Sale\Payment)
1235  {
1236  $filter['ENTITY_REGISTRY_TYPE'] = $entity::getRegistryType();
1237  $filter['PAYMENT_ID'] = $entity->getId();
1238  }
1239  elseif ($entity instanceof Sale\Shipment)
1240  {
1241  $filter['ENTITY_REGISTRY_TYPE'] = $entity::getRegistryType();
1242  $filter['SHIPMENT_ID'] = $entity->getId();
1243  }
1244 
1245  return static::collectInfo($filter);
1246  }
1247 
1248  return array();
1249  }

◆ getCheckInfoByExternalUuid()

static getCheckInfoByExternalUuid (   $uuid)
static
Аргументы
$uuid
Возвращает
array|false
Исключения
Main

См. определение в файле checkmanager.php строка 1352

1353  {
1354  $dbRes = static::getList(array('filter' => array('EXTERNAL_UUID' => $uuid)));
1355  return $dbRes->fetch();
1356  }

◆ getCheckList()

static getCheckList ( )
static
Возвращает
array

См. определение в файле checkmanager.php строка 681

682  {
683  static $checkList = array();
684  if (!$checkList)
685  {
686  $checkList = array_merge(
687  static::getBuildInCheckList(),
688  array_keys(static::getUserCheckList())
689  );
690  }
691 
692  return $checkList;
693  }

◆ getCheckTypeMap()

static getCheckTypeMap ( )
static
Возвращает
array

См. определение в файле checkmanager.php строка 709

710  {
711  static::init();
712 
713  $result = array();
714  $checkMap = static::getCheckList();
715 
716  /** @var Check $className */
717  foreach ($checkMap as $className)
718  {
719  if (class_exists($className))
720  {
721  $result[$className::getType()] = $className;
722  }
723  }
724 
725  return $result;
726  }

◆ getLastPrintableCheckInfo()

static getLastPrintableCheckInfo ( Sale\Internals\CollectableEntity  $entity)
static
Аргументы
CollectableEntity$entity
Возвращает
array|false
Исключения
Main

См. определение в файле checkmanager.php строка 1256

1257  {
1258  if (!($entity instanceof Sale\Payment)
1259  && !($entity instanceof Sale\Shipment)
1260  )
1261  {
1262  return array();
1263  }
1264 
1265  $filter = array(
1266  'STATUS' => 'Y',
1267  'ENTITY_REGISTRY_TYPE' => $entity::getRegistryType()
1268  );
1269  if ($entity instanceof Sale\Payment)
1270  {
1271  $filter['PAYMENT_ID'] = $entity->getId();
1272  }
1273  elseif ($entity instanceof Sale\Shipment)
1274  {
1275  $filter['SHIPMENT_ID'] = $entity->getId();
1276  }
1277 
1278  $dbRes = static::getList(
1279  array(
1280  'select' => array('*'),
1281  'filter' => $filter,
1282  'order' => array('DATE_PRINT_END' => 'DESC'),
1283  'limit' => 1
1284  )
1285  );
1286 
1287  if ($data = $dbRes->fetch())
1288  {
1289  $data['LINK'] = '';
1290  if (!empty($data['LINK_PARAMS']))
1291  {
1292  $cashbox = Manager::getObjectById($data['CASHBOX_ID']);
1293  if ($cashbox)
1294  $data['LINK'] = $cashbox->getCheckLink($data['LINK_PARAMS']);
1295  }
1296 
1297  return $data;
1298  }
1299 
1300  return array();
1301  }

◆ getList()

static getList ( array  $parameters = array())
static
Аргументы
array$parameters
Возвращает
Main\DB\Result
Исключения
Main

См. определение в файле checkmanager.php строка 1389

1390  {
1391  return CashboxCheckTable::getList($parameters);
1392  }

◆ getObjectById()

static getObjectById (   $id)
static
Аргументы
$id
Возвращает
Check|null
Исключения
Main

См. определение в файле checkmanager.php строка 1365

1366  {
1367  if ($id <= 0)
1368  return null;
1369 
1370  $dbRes = CashboxCheckTable::getById($id);
1371  if ($checkInfo = $dbRes->fetch())
1372  {
1373  $check = static::createByType($checkInfo['TYPE']);
1374  if ($check)
1375  {
1376  $check->init($checkInfo);
1377  return $check;
1378  }
1379  }
1380 
1381  return null;
1382  }
static getById($id)
Returns selection by entity's primary key.

◆ getOrder()

static getOrder (   $entity)
static
Аргументы
Sale\Internals\CollectableEntity$entity
Исключения
Main

См. определение в файле checkmanager.php строка 572

573  {
574  $order = null;
575 
576  if ($entity instanceof Sale\Payment)
577  {
578  /** @var Sale\PaymentCollection $col */
579  $col = $entity->getCollection();
580  $order = $col->getOrder();
581  }
582  elseif ($entity instanceof Sale\Shipment)
583  {
584  /** @var Sale\ShipmentCollection $col */
585  $col = $entity->getCollection();
586  $order = $col->getOrder();
587  }
588  else
589  {
590  throw new Main\ArgumentTypeException("entities");
591  }
592 
593  return $order;
594  }

◆ getPrintableChecks()

static getPrintableChecks ( array  $cashboxIds,
array  $orderIds = array() 
)
static
Аргументы
array$cashboxIds
array$orderIds
Возвращает
array
Исключения
Main

См. определение в файле checkmanager.php строка 1100

1101  {
1102  $result = array();
1103 
1105  $dbLocRes = $con->query("SELECT GET_LOCK('get_check_list', 0) as L");
1106  $locResult = $dbLocRes->fetch();
1107  if ($locResult["L"] == "0")
1108  {
1109  return $result;
1110  }
1111 
1112  $filter = array(
1113  'LINK_PARAMS' => '',
1114  'CHECK2CASHBOX.CASHBOX_ID' => $cashboxIds,
1115  array(
1116  'LOGIC' => 'OR',
1117  array(
1118  '=STATUS' => 'N',
1119  'DATE_PRINT_START' => ''
1120  ),
1121  array(
1122  '=STATUS' => 'P',
1123  '<MAX_DT_REPEAT_CHECK' => new Type\DateTime()
1124  )
1125  )
1126  );
1127 
1128  if ($orderIds)
1129  {
1130  $filter['ORDER_ID'] = $orderIds;
1131  }
1132 
1133  $limit = count($cashboxIds)*static::CHECK_LIMIT_RECORDS;
1134  $dbRes = static::getList(
1135  array(
1136  'select' => array('*', 'AVAILABLE_CASHBOX_ID' => 'CHECK2CASHBOX.CASHBOX_ID'),
1137  'filter' => $filter,
1138  'limit' => $limit,
1139  'runtime' => array(
1140  new Main\Entity\ExpressionField(
1141  'MAX_DT_REPEAT_CHECK',
1142  'DATE_ADD(DATE_PRINT_START, INTERVAL '.static::CHECK_RESENDING_TIME.' MINUTE)',
1143  null,
1144  array(
1145  'data_type' => 'datetime'
1146  )
1147  )
1148  )
1149  )
1150  );
1151 
1152  if ($data = $dbRes->fetch())
1153  {
1154  $i = 0;
1155  do
1156  {
1157  if (!isset($result[$data['ID']]))
1158  {
1159  $i++;
1160  if ($i > static::CHECK_LIMIT_RECORDS)
1161  break;
1162 
1163  $result[$data['ID']] = $data;
1164  $result[$data['ID']]['CASHBOX_LIST'] = array();
1165  }
1166 
1167  $result[$data['ID']]['CASHBOX_LIST'][] = $data['AVAILABLE_CASHBOX_ID'];
1168  }
1169  while ($data = $dbRes->fetch());
1170 
1171  foreach ($result as $checkId => $item)
1172  {
1173  if ($item['STATUS'] === 'P')
1174  {
1175  $now = new Type\DateTime();
1176  $nowTs = $now->getTimestamp();
1177 
1178  /** @var Type\DateTime $dateStartPrint */
1179  $dateStartPrint = $item['DATE_PRINT_START'];
1180  $dateStartPrintTs = $dateStartPrint->getTimestamp();
1181 
1182  if ($nowTs - $dateStartPrintTs > static::MIN_TIME_FOR_SWITCH_CASHBOX)
1183  {
1184  $availableCashboxIds = array_diff($item['CASHBOX_LIST'], array($item['CASHBOX_ID']));
1185  if ($availableCashboxIds)
1186  {
1187  $result[$checkId]['CASHBOX_ID'] = Manager::chooseCashbox($availableCashboxIds);
1188  CashboxCheckTable::update($checkId, array('CASHBOX_ID' => $result[$checkId]['CASHBOX_ID']));
1189  }
1190  }
1191  else
1192  {
1193  if ($item['CASHBOX_ID'] > 0 && !in_array($item['CASHBOX_ID'], $cashboxIds))
1194  unset($result[$checkId]);
1195  }
1196 
1197  continue;
1198  }
1199 
1200  $result[$checkId]['CASHBOX_ID'] = Manager::chooseCashbox($item['CASHBOX_LIST']);
1201  CashboxCheckTable::update($checkId, array('STATUS' => 'P', 'DATE_PRINT_START' => new Type\DateTime(), 'CASHBOX_ID' => $result[$checkId]['CASHBOX_ID']));
1202  }
1203  }
1204 
1205  $con->query("SELECT RELEASE_LOCK('get_check_list')");
1206 
1207  return $result;
1208  }
static getConnection($name="")
Static method returns database connection for the specified name.

◆ getRelatedEntitiesForPayment()

static getRelatedEntitiesForPayment (   $checkType,
  $paymentId,
  $registryType = Sale\Registry::REGISTRY_TYPE_ORDER 
)
static
Аргументы
$checkType
$paymentId
string$registryType
Возвращает
array
Исключения
Main

См. определение в файле checkmanager.php строка 1402

1403  {
1404  $result = array();
1405 
1406  $check = static::createByType($checkType);
1407  if ($check === null)
1408  {
1409  throw new Main\ArgumentTypeException($checkType);
1410  }
1411 
1412  $registry = Sale\Registry::getInstance($registryType);
1413  /** @var Sale\Payment $paymentClassName */
1414  $paymentClassName = $registry->getPaymentClassName();
1415 
1416  $dbRes = $paymentClassName::getList(array(
1417  'select' => array('ORDER_ID'),
1418  'filter' => array('=ID' => $paymentId)
1419  ));
1420 
1421  $paymentData = $dbRes->fetch();
1422  if (!$paymentData)
1423  {
1424  return $result;
1425  }
1426 
1427  if ($check::getSupportedRelatedEntityType() === Check::SUPPORTED_ENTITY_TYPE_PAYMENT
1428  || $check::getSupportedRelatedEntityType() === Check::SUPPORTED_ENTITY_TYPE_ALL
1429  )
1430  {
1432  {
1433  $dbRes = $paymentClassName::getList(array(
1434  'select' => array('ID', 'ACCOUNT_NUMBER', 'NAME' => 'PAY_SYSTEM.NAME'),
1435  'filter' => array(
1436  '!ID' => $paymentId,
1437  '=ORDER_ID' => $paymentData['ORDER_ID']
1438  )
1439  ));
1440 
1441  while ($data = $dbRes->fetch())
1442  {
1443  $data['PAYMENT_TYPES'] = array(
1444  array(
1445  'CODE' => Sale\Cashbox\Check::PAYMENT_TYPE_ADVANCE,
1446  'NAME' => Loc::getMessage('SALE_CASHBOX_CHECK_ADVANCE'),
1447  ),
1448  array(
1449  'CODE' => Sale\Cashbox\Check::PAYMENT_TYPE_CREDIT,
1450  'NAME' => Loc::getMessage('SALE_CASHBOX_CHECK_CREDIT'),
1451  )
1452  );
1453 
1454  $result['PAYMENTS'][$data['ID']] = $data;
1455  }
1456  }
1457  }
1458  if ($check::getSupportedRelatedEntityType() === Check::SUPPORTED_ENTITY_TYPE_SHIPMENT
1459  || $check::getSupportedRelatedEntityType() === Check::SUPPORTED_ENTITY_TYPE_ALL
1460  )
1461  {
1462  /** @var Sale\Shipment $shipmentClassName */
1463  $shipmentClassName = $registry->getShipmentClassName();
1464  $dbRes = $shipmentClassName::getList(array(
1465  'select' => array('ID', 'ACCOUNT_NUMBER', 'NAME' => 'DELIVERY.NAME'),
1466  'filter' => array(
1467  '=ORDER_ID' => $paymentData['ORDER_ID'],
1468  'SYSTEM' => 'N'
1469  )
1470  ));
1471 
1472  while ($data = $dbRes->fetch())
1473  {
1474  $result['SHIPMENTS'][$data['ID']] = $data;
1475  }
1476  }
1477 
1478  return $result;
1479  }

◆ getRelatedEntitiesForShipment()

static getRelatedEntitiesForShipment (   $checkType,
  $shipmentId,
  $registryType = Sale\Registry::REGISTRY_TYPE_ORDER 
)
static
Аргументы
$checkType
$shipmentId
string$registryType
Возвращает
array
Исключения
Main

См. определение в файле checkmanager.php строка 1489

1490  {
1491  $result = array();
1492 
1494  {
1495  return $result;
1496  }
1497 
1498  $check = static::createByType($checkType);
1499  if ($check === null)
1500  {
1501  throw new Main\ArgumentTypeException($checkType);
1502  }
1503 
1504  $registry = Sale\Registry::getInstance($registryType);
1505  /** @var Sale\Shipment $shipmentClassName */
1506  $shipmentClassName = $registry->getShipmentClassName();
1507 
1508  $dbRes = $shipmentClassName::getList(array(
1509  'select' => array('ORDER_ID'),
1510  'filter' => array('=ID' => $shipmentId)
1511  ));
1512 
1513  $shipmentData = $dbRes->fetch();
1514  if (!$shipmentData)
1515  {
1516  return $result;
1517  }
1518 
1519  if ($check::getSupportedRelatedEntityType() === Check::SUPPORTED_ENTITY_TYPE_SHIPMENT
1520  || $check::getSupportedRelatedEntityType() === Check::SUPPORTED_ENTITY_TYPE_ALL
1521  )
1522  {
1523  $dbRes = $shipmentClassName::getList(array(
1524  'select' => array('ID', 'ACCOUNT_NUMBER', 'NAME' => 'DELIVERY.NAME'),
1525  'filter' => array(
1526  '!ID' => $shipmentId,
1527  '=ORDER_ID' => $shipmentData['ORDER_ID'],
1528  'SYSTEM' => 'N'
1529  )
1530  ));
1531 
1532  while ($data = $dbRes->fetch())
1533  {
1534  $result['SHIPMENTS'][$data['ID']] = $data;
1535  }
1536  }
1537 
1538  if ($check::getSupportedRelatedEntityType() === Check::SUPPORTED_ENTITY_TYPE_PAYMENT
1539  || $check::getSupportedRelatedEntityType() === Check::SUPPORTED_ENTITY_TYPE_ALL
1540  )
1541  {
1542  /** @var Sale\Payment $paymentClassName */
1543  $paymentClassName = $registry->getPaymentClassName();
1544  $dbRes = $paymentClassName::getList(array(
1545  'select' => array('ID', 'ACCOUNT_NUMBER', 'NAME' => 'PAY_SYSTEM.NAME'),
1546  'filter' => array(
1547  '=ORDER_ID' => $shipmentData['ORDER_ID']
1548  )
1549  ));
1550 
1551  while ($data = $dbRes->fetch())
1552  {
1553  $data['PAYMENT_TYPES'] = array(
1554  array(
1555  'CODE' => Sale\Cashbox\Check::PAYMENT_TYPE_ADVANCE,
1556  'NAME' => Loc::getMessage('SALE_CASHBOX_CHECK_ADVANCE'),
1557  ),
1558  array(
1559  'CODE' => Sale\Cashbox\Check::PAYMENT_TYPE_CREDIT,
1560  'NAME' => Loc::getMessage('SALE_CASHBOX_CHECK_CREDIT'),
1561  )
1562  );
1563 
1564  $result['PAYMENTS'][$data['ID']] = $data;
1565  }
1566  }
1567 
1568  return $result;
1569  }

◆ getSalesCheckList()

static getSalesCheckList ( )
static

См. определение в файле checkmanager.php строка 695

696  {
697  return array_filter(
698  self::getCheckList(),
699  function ($value)
700  {
701  return is_subclass_of($value, Check::class);
702  }
703  );
704  }

◆ init()

static init ( )
static
Возвращает
void

См. определение в файле checkmanager.php строка 666

667  {
668  static $isInit = false;
669 
670  if ($isInit === false)
671  {
672  $handlers = static::getUserCheckList();
673  Main\Loader::registerAutoLoadClasses(null, $handlers);
674  $isInit = true;
675  }
676  }
static registerAutoLoadClasses($moduleName, array $classes)
Registers classes for auto loading.

◆ isAvailableCorrection()

static isAvailableCorrection ( )
static
Возвращает
bool

См. определение в файле checkmanager.php строка 174

174  : bool
175  {
176  foreach (Manager::getListFromCache() as $item)
177  {
178  if ($item['ACTIVE'] !== 'Y')
179  {
180  continue;
181  }
182 
183  $cashbox = Manager::getObjectById($item['ID']);
184  if ($cashbox instanceof ICorrection)
185  {
186  return true;
187  }
188  }
189 
190  return false;
191  }

◆ savePrintResult()

static savePrintResult (   $checkId,
array  $data 
)
static
Аргументы
$checkId
array$data
Возвращает
Result
Исключения
Main

См. определение в файле checkmanager.php строка 280

281  {
282  $result = new Result();
283 
284  if ($checkId <= 0)
285  {
286  $result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_ID')));
287  return $result;
288  }
289 
290  $order = null;
291  $payment = null;
292  $shipment = null;
293 
294  $dbRes = static::getList(array('select' => array('*'), 'filter' => array('ID' => $checkId)));
295  $check = $dbRes->fetch();
296  if (!$check)
297  {
298  $result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_NOT_FOUND', array('#CHECK_ID#' => $checkId))));
299  return $result;
300  }
301 
302  if ($check['STATUS'] === 'Y')
303  return $result;
304 
305  $registry = Sale\Registry::getInstance($check['ENTITY_REGISTRY_TYPE']);
306 
307  if ($check['ORDER_ID'] > 0)
308  {
309  /** @var Sale\Order $orderClassName */
310  $orderClassName = $registry->getOrderClassName();
311  $order = $orderClassName::load($check['ORDER_ID']);
312  if ($order === null)
313  {
314  $result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_ORDER_LOAD')));
315  return $result;
316  }
317 
318  $paymentCollection = $order->getPaymentCollection();
319  if ($check['PAYMENT_ID'] > 0)
320  {
321  $payment = $paymentCollection->getItemById($check['PAYMENT_ID']);
322  if ($payment === null)
323  {
324  $result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_PAYMENT_LOAD')));
325  return $result;
326  }
327  }
328 
329  $shipmentCollection = $order->getShipmentCollection();
330  if ($check['SHIPMENT_ID'] > 0)
331  {
332  $shipment = $shipmentCollection->getItemById($check['SHIPMENT_ID']);
333  if ($shipment === null)
334  {
335  $result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_SHIPMENT_LOAD')));
336  return $result;
337  }
338  }
339  }
340 
341  if (isset($data['ERROR']))
342  {
343  $errorMessage = Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_PRINT', array('#CHECK_ID#' => $checkId));
344  if ($data['ERROR']['MESSAGE'])
345  $errorMessage .= ': '.$data['ERROR']['MESSAGE'];
346 
347  if ($data['ERROR']['TYPE'] === Errors\Warning::TYPE)
348  {
349  if ($check['CNT_FAIL_PRINT'] >= 3)
350  {
351  $data['ERROR']['TYPE'] = Errors\Error::TYPE;
352  }
353  else
354  {
355  CashboxCheckTable::update($checkId, array('CNT_FAIL_PRINT' => $check['CNT_FAIL_PRINT'] + 1));
356  $result->addError(new Errors\Warning($errorMessage));
357  return $result;
358  }
359  }
360 
361  if ($data['ERROR']['TYPE'] === Errors\Error::TYPE)
362  {
363  $updatedFields = array('STATUS' => 'E', 'DATE_PRINT_END' => new Main\Type\DateTime());
364  if ((int)$check['CNT_FAIL_PRINT'] === 0)
365  $updatedFields['CNT_FAIL_PRINT'] = 1;
366 
367  CashboxCheckTable::update($checkId, $updatedFields);
368 
369  /** @ToDO Will be removed after OrderCheckCollection is realized */
370  if (
371  class_exists('\Bitrix\Crm\Order\Order')
372  && $order instanceof \Bitrix\Crm\Order\Order
373  && $order->getDealBinding()
374  )
375  {
376  $order->addTimelineCheckEntryOnCreate($checkId, ['PRINTED' => 'N']);
377  }
378 
379  if ($order !== null
380  && (
381  $payment !== null
382  || $shipment !== null
383  )
384  )
385  {
386  $r = new Result();
387  $errorCode = isset($data['ERROR']['CODE']) ? $data['ERROR']['CODE'] : 0;
388  $r->addWarning(new Main\Error($errorMessage, $errorCode));
389 
390  /** @var EntityMarker $markerClassName */
391  $markerClassName = $registry->getEntityMarkerClassName();
392 
393  if ($payment !== null)
394  {
395  $markerClassName::addMarker($order, $payment, $r);
396  $payment->setField('MARKED', 'Y');
397 
398  /** @var Sale\Notify $notifyClassName */
399  $notifyClassName = $registry->getNotifyClassName();
400  $notifyClassName::callNotify($payment, Sale\EventActions::EVENT_ON_CHECK_PRINT_ERROR);
401  }
402  elseif ($shipment !== null)
403  {
404  $markerClassName::addMarker($order, $shipment, $r);
405  $shipment->setField('MARKED', 'Y');
406 
407  /** @var Sale\Notify $notifyClassName */
408  $notifyClassName = $registry->getNotifyClassName();
409  $notifyClassName::callNotify($shipment, Sale\EventActions::EVENT_ON_CHECK_PRINT_ERROR);
410  }
411 
412  $order->save();
413  }
414 
415  $error = new Errors\Error($errorMessage);
416  Logger::addError($error->getMessage(), $check['CASHBOX_ID']);
417  }
418  else
419  {
420  $error = new Errors\Warning($errorMessage);
421  Logger::addWarning($error->getMessage(), $check['CASHBOX_ID']);
422  }
423 
424  $event = new Main\Event('sale', static::EVENT_ON_CHECK_PRINT_ERROR, array($data));
425  $event->send();
426 
427  $result->addError($error);
428  }
429  else
430  {
431  $updateResult = CashboxCheckTable::update(
432  $checkId,
433  array(
434  'STATUS' => 'Y',
435  'LINK_PARAMS' => $data['LINK_PARAMS'],
436  'DATE_PRINT_END' => new Main\Type\DateTime()
437  )
438  );
439 
440  if ($updateResult->isSuccess())
441  {
442  self::addStatisticOnSuccessCheckPrint($checkId);
443 
444  /** @ToDO Will be removed after OrderCheckCollection is realized */
445  if (
446  class_exists('\Bitrix\Crm\Order\Order')
447  && $order instanceof \Bitrix\Crm\Order\Order
448  && $order->getDealBinding()
449  )
450  {
451  $order->addTimelineCheckEntryOnCreate($checkId, ['PRINTED' => 'Y']);
452  }
453 
454  $isSend = false;
455  $event = new Main\Event(
456  'sale',
457  static::EVENT_ON_CHECK_PRINT_SEND,
458  array('PAYMENT' => $payment, 'SHIPMENT' => $shipment, 'CHECK' => $check)
459  );
460  $event->send();
461 
462  $eventResults = $event->getResults();
463  /** @var Main\EventResult $eventResult */
464  foreach($eventResults as $eventResult)
465  {
466  if($eventResult->getType() == Main\EventResult::SUCCESS)
467  $isSend = true;
468  }
469 
470  if (!$isSend)
471  {
472  if ($payment !== null)
473  {
474  /** @var Sale\Notify $notifyClassName */
475  $notifyClassName = $registry->getNotifyClassName();
476  $notifyClassName::callNotify($payment, Sale\EventActions::EVENT_ON_CHECK_PRINT);
477  }
478  elseif ($shipment !== null)
479  {
480  /** @var Sale\Notify $notifyClassName */
481  $notifyClassName = $registry->getNotifyClassName();
482  $notifyClassName::callNotify($shipment, Sale\EventActions::EVENT_ON_CHECK_PRINT);
483  }
484  }
485  }
486  else
487  {
488  $result->addErrors($updateResult->getErrors());
489  }
490  }
491 
492  return $result;
493  }
static addError(string $message, $cashboxId=null)
static addWarning(string $message, $cashboxId=null)

Поля

◆ CHECK_LIMIT_RECORDS

const CHECK_LIMIT_RECORDS = 5

См. определение в файле checkmanager.php строка 33

◆ CHECK_RESENDING_TIME

const CHECK_RESENDING_TIME = 4

This is time re-sending a check print in minutes.

См. определение в файле checkmanager.php строка 32

◆ EVENT_ON_BEFORE_CHECK_ADD_VERIFY

const EVENT_ON_BEFORE_CHECK_ADD_VERIFY = 'OnBeforeCheckAddVerify'

См. определение в файле checkmanager.php строка 27

◆ EVENT_ON_CHECK_PRINT_ERROR

const EVENT_ON_CHECK_PRINT_ERROR = 'OnCheckPrintError'

См. определение в файле checkmanager.php строка 28

◆ EVENT_ON_CHECK_PRINT_SEND

const EVENT_ON_CHECK_PRINT_SEND = 'OnPrintableCheckSend'

См. определение в файле checkmanager.php строка 26

◆ EVENT_ON_GET_CUSTOM_CHECK

const EVENT_ON_GET_CUSTOM_CHECK = 'OnGetCustomCheckList'

См. определение в файле checkmanager.php строка 25

◆ MIN_TIME_FOR_SWITCH_CASHBOX

const MIN_TIME_FOR_SWITCH_CASHBOX = 240

См. определение в файле checkmanager.php строка 29


Объявления и описания членов класса находятся в файле: