1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
cashboxatolfarmv4.php
См. документацию.
1<?php
2
3namespace Bitrix\Sale\Cashbox;
4
5use Bitrix\Main;
6use Bitrix\Main\Localization;
7use Bitrix\Sale\Result;
8
10
16{
17 const SERVICE_URL = 'https://online.atol.ru/possystem/v4';
18 const SERVICE_TEST_URL = 'https://testonline.atol.ru/possystem/v4';
19
20 const HANDLER_MODE_ACTIVE = 'ACTIVE';
21 const HANDLER_MODE_TEST = 'TEST';
22
23 const CODE_VAT_5 = 'vat5';
24 const CODE_VAT_7 = 'vat7';
25
26 const CODE_CALC_VAT_5 = 'vat105';
27 const CODE_CALC_VAT_7 = 'vat107';
28 const CODE_CALC_VAT_10 = 'vat110';
29 const CODE_CALC_VAT_20 = 'vat120';
30
35 public function buildCheckQuery(Check $check)
36 {
37 $data = $check->getDataForCheck();
38
40 $dateTime = $data['date_create'];
41
42 $serviceEmail = $this->getValueFromSettings('SERVICE', 'EMAIL');
43 if (!$serviceEmail)
44 {
45 $serviceEmail = static::getDefaultServiceEmail();
46 }
47
48 $result = [
49 'timestamp' => $dateTime->format('d.m.Y H:i:s'),
50 'external_id' => static::buildUuid(static::UUID_TYPE_CHECK, $data['unique_id']),
51 'service' => [
52 'callback_url' => $this->getCallbackUrl(),
53 ],
54 'receipt' => [
55 'client' => [],
56 'company' => [
57 'email' => $serviceEmail,
58 'sno' => $this->getValueFromSettings('TAX', 'SNO'),
59 'inn' => $this->getValueFromSettings('SERVICE', 'INN'),
60 'payment_address' => $this->getValueFromSettings('SERVICE', 'P_ADDRESS'),
61 ],
62 'internet' => $this->getField('USE_OFFLINE') === 'N',
63 'payments' => [],
64 'items' => [],
65 'total' => (float)$data['total_sum']
66 ]
67 ];
68
69 $email = $data['client_email'] ?? '';
70
71 $phone = \NormalizePhone($data['client_phone'] ?? null);
72 if (is_string($phone))
73 {
74 if ($phone[0] !== '7')
75 {
76 $phone = '7'.$phone;
77 }
78
79 $phone = '+'.$phone;
80 }
81 else
82 {
83 $phone = '';
84 }
85
86 $clientInfo = $this->getValueFromSettings('CLIENT', 'INFO');
87 if ($clientInfo === 'PHONE')
88 {
89 $result['receipt']['client'] = ['phone' => $phone];
90 }
91 elseif ($clientInfo === 'EMAIL')
92 {
93 $result['receipt']['client'] = ['email' => $email];
94 }
95 else
96 {
97 $result['receipt']['client'] = [];
98
99 if ($email)
100 {
101 $result['receipt']['client']['email'] = $email;
102 }
103
104 if ($phone)
105 {
106 $result['receipt']['client']['phone'] = $phone;
107 }
108 }
109
110 if (isset($data['payments']))
111 {
112 $paymentTypeMap = $this->getPaymentTypeMap();
113 foreach ($data['payments'] as $payment)
114 {
115 $result['receipt']['payments'][] = [
116 'type' => $paymentTypeMap[$payment['type']],
117 'sum' => (float)$payment['sum']
118 ];
119 }
120 }
121
122 foreach ($data['items'] as $item)
123 {
124 $result['receipt']['items'][] = $this->buildPosition($data, $item);
125 }
126
127 return $result;
128 }
129
135 protected function buildPosition(array $checkData, array $item): array
136 {
137 $result = [
138 'name' => $this->buildPositionName($item),
139 'price' => $this->buildPositionPrice($item),
140 'sum' => $this->buildPositionSum($item),
141 'quantity' => $this->buildPositionQuantity($item),
142 'payment_method' => $this->buildPositionPaymentMethod($checkData),
143 'payment_object' => $this->buildPositionPaymentObject($item),
144 'vat' => [
145 'type' => $this->buildPositionVatType($checkData, $item)
146 ],
147 ];
148
149 if (isset($item['nomenclature_code']))
150 {
151 $result['nomenclature_code'] = $this->buildPositionNomenclatureCode($item['nomenclature_code']);
152 }
153
154 return $result;
155 }
156
161 protected function buildPositionName(array $item)
162 {
163 return mb_substr($item['name'], 0, static::MAX_NAME_LENGTH);
164 }
165
170 protected function buildPositionPrice(array $item)
171 {
172 return (float)$item['price'];
173 }
174
179 protected function buildPositionSum(array $item)
180 {
181 return (float)$item['sum'];
182 }
183
188 protected function buildPositionQuantity(array $item)
189 {
190 return $item['quantity'];
191 }
192
197 protected function buildPositionPaymentMethod(array $checkData)
198 {
199 $checkTypeMap = $this->getCheckTypeMap();
200
201 return $checkTypeMap[$checkData['type']];
202 }
203
208 protected function buildPositionPaymentObject(array $item)
209 {
210 $paymentObjectMap = $this->getPaymentObjectMap();
211
212 return $paymentObjectMap[$item['payment_object']];
213 }
214
220 protected function buildPositionVatType(array $checkData, array $item)
221 {
222 $vat = $this->getValueFromSettings('VAT', $item['vat']);
223 if ($vat === null)
224 {
225 $vat = $this->getValueFromSettings('VAT', 'NOT_VAT');
226 }
227
228 return $this->mapVatValue($checkData['type'], $vat);
229 }
230
236 {
237 $hexCode = bin2hex($code);
238 $hexCodeArray = str_split($hexCode, 2);
239 $hexCodeArray = array_map('ToUpper', $hexCodeArray);
240
241 return join(' ', $hexCodeArray);
242 }
243
250 {
251 $checkQuery = $this->buildCorrectionCheckQuery($check);
252
253 $operation = 'sell_correction';
254 if ($check::getCalculatedSign() === Check::CALCULATED_SIGN_CONSUMPTION)
255 {
256 $operation = 'sell_refund';
257 }
258
259 return $this->registerCheck($operation, $checkQuery);
260 }
261
266 public function buildCorrectionCheckQuery(CorrectionCheck $check)
267 {
268 $data = $check->getDataForCheck();
269
271 $dateTime = $data['date_create'];
272
273 $documentDate = $data['correction_info']['document_date'];
274 if (!$documentDate instanceof Main\Type\Date)
275 {
276 $documentDate = new Main\Type\Date($documentDate);
277 }
278
279 $result = [
280 'timestamp' => $dateTime->format('d.m.Y H:i:s'),
281 'external_id' => static::buildUuid(static::UUID_TYPE_CHECK, $data['unique_id']),
282 'service' => [
283 'callback_url' => $this->getCallbackUrl(),
284 ],
285 'correction' => [
286 'company' => [
287 'sno' => $this->getValueFromSettings('TAX', 'SNO'),
288 'inn' => $this->getValueFromSettings('SERVICE', 'INN'),
289 'payment_address' => $this->getValueFromSettings('SERVICE', 'P_ADDRESS'),
290 ],
291 'correction_info' => [
292 'type' => $data['correction_info']['type'],
293 'base_date' => $documentDate->format('d.m.Y H:i:s'),
294 'base_number' => $data['correction_info']['document_number'],
295 'base_name' => mb_substr(
296 $data['correction_info']['description'],
297 0,
298 255
299 ),
300 ],
301 'payments' => [],
302 'vats' => []
303 ]
304 ];
305
306 if (isset($data['payments']))
307 {
308 $paymentTypeMap = $this->getPaymentTypeMap();
309 foreach ($data['payments'] as $payment)
310 {
311 $result['correction']['payments'][] = [
312 'type' => $paymentTypeMap[$payment['type']],
313 'sum' => (float)$payment['sum']
314 ];
315 }
316 }
317
318 if (isset($data['vats']))
319 {
320 foreach ($data['vats'] as $item)
321 {
322 $vat = $this->getValueFromSettings('VAT', $item['type']);
323 if (is_null($vat) || $vat === '')
324 {
325 $vat = $this->getValueFromSettings('VAT', 'NOT_VAT');
326 }
327
328 $result['correction']['vats'][] = [
329 'type' => $vat,
330 'sum' => (float)$item['sum']
331 ];
332 }
333 }
334
335 return $result;
336 }
337
338 public function checkCorrection(CorrectionCheck $check)
339 {
340 return $this->checkByUuid(
341 $check->getField('EXTERNAL_UUID')
342 );
343 }
344
350 private function mapVatValue($checkType, $vat)
351 {
353 $this->getVatToCalcVatMap()
354 );
355
356 $map = $mapper->getMap();
357
358 return $map[$vat][$checkType] ?? $vat;
359 }
360
361 protected static function getDefaultVatList(): array
362 {
363 $vatList = parent::getDefaultVatList();
364
365 return $vatList + [5 => self::CODE_VAT_5, 7 => self::CODE_VAT_7];
366 }
367
368 protected function getVatToCalcVatMap() : array
369 {
370 return [
371 self::CODE_VAT_5 => self::CODE_CALC_VAT_5,
372 self::CODE_VAT_7 => self::CODE_CALC_VAT_7,
373 self::CODE_VAT_10 => self::CODE_CALC_VAT_10,
374 self::CODE_VAT_20 => self::CODE_CALC_VAT_20,
375 ];
376 }
377
381 protected function getPaymentObjectMap()
382 {
383 return [
384 Check::PAYMENT_OBJECT_COMMODITY => 'commodity',
389 Check::PAYMENT_OBJECT_GAMBLING_BET => 'gambling_bet',
390 Check::PAYMENT_OBJECT_GAMBLING_PRIZE => 'gambling_prize',
392 Check::PAYMENT_OBJECT_LOTTERY_PRIZE => 'lottery_prize',
393 Check::PAYMENT_OBJECT_INTELLECTUAL_ACTIVITY => 'intellectual_activity',
394 Check::PAYMENT_OBJECT_AGENT_COMMISSION => 'agent_commission',
395 Check::PAYMENT_OBJECT_COMPOSITE => 'composite',
397 Check::PAYMENT_OBJECT_PROPERTY_RIGHT => 'property_right',
398 Check::PAYMENT_OBJECT_NON_OPERATING_GAIN => 'non-operating_gain',
399 Check::PAYMENT_OBJECT_SALES_TAX => 'sales_tax',
400 Check::PAYMENT_OBJECT_RESORT_FEE => 'resort_fee',
403 Check::PAYMENT_OBJECT_PENSION_INSURANCE_IP => 'pension_insurance_ip',
404 Check::PAYMENT_OBJECT_PENSION_INSURANCE => 'pension_insurance',
405 Check::PAYMENT_OBJECT_MEDICAL_INSURANCE_IP => 'medical_insurance_ip',
406 Check::PAYMENT_OBJECT_MEDICAL_INSURANCE => 'medical_insurance',
407 Check::PAYMENT_OBJECT_SOCIAL_INSURANCE => 'social_insurance',
408 Check::PAYMENT_OBJECT_CASINO_PAYMENT => 'casino_payment',
413 ];
414 }
415
419 private function getPaymentTypeMap()
420 {
421 return array(
426 );
427 }
428
432 private static function getDefaultServiceEmail()
433 {
434 return Main\Config\Option::get('main', 'email_from');
435 }
436
440 public static function getName()
441 {
442 return Localization\Loc::getMessage('SALE_CASHBOX_ATOL_FARM_V4_TITLE');
443 }
444
448 protected function getCheckTypeMap()
449 {
450 return array(
451 SellCheck::getType() => 'full_payment',
452 SellReturnCashCheck::getType() => 'full_payment',
453 SellReturnCheck::getType() => 'full_payment',
454 AdvancePaymentCheck::getType() => 'advance',
455 AdvanceReturnCashCheck::getType() => 'advance',
456 AdvanceReturnCheck::getType() => 'advance',
457 PrepaymentCheck::getType() => 'prepayment',
458 PrepaymentReturnCheck::getType() => 'prepayment',
459 PrepaymentReturnCashCheck::getType() => 'prepayment',
460 FullPrepaymentCheck::getType() => 'full_prepayment',
461 FullPrepaymentReturnCheck::getType() => 'full_prepayment',
462 FullPrepaymentReturnCashCheck::getType() => 'full_prepayment',
463 CreditCheck::getType() => 'credit',
464 CreditReturnCheck::getType() => 'credit',
465 CreditPaymentCheck::getType() => 'credit_payment',
466 CreditPaymentReturnCashCheck::getType() => 'credit_payment',
467 CreditPaymentReturnCheck::getType() => 'credit_payment',
468 );
469 }
470
478 protected function getRequestUrl($operation, $token, array $queryData = array())
479 {
480 $serviceUrl = static::SERVICE_URL;
481
482 if ($this->getValueFromSettings('INTERACTION', 'MODE_HANDLER') === static::HANDLER_MODE_TEST)
483 {
484 $serviceUrl = static::SERVICE_TEST_URL;
485 }
486
487 $groupCode = $this->getField('NUMBER_KKM');
488
489 if ($operation === static::OPERATION_CHECK_REGISTRY)
490 {
491 return $serviceUrl.'/'.$groupCode.'/'.$queryData['CHECK_TYPE'].'?token='.$token;
492 }
493 elseif ($operation === static::OPERATION_CHECK_CHECK)
494 {
495 return $serviceUrl.'/'.$groupCode.'/report/'.$queryData['EXTERNAL_UUID'].'?token='.$token;
496 }
497 elseif ($operation === static::OPERATION_GET_TOKEN)
498 {
499 return $serviceUrl.'/getToken';
500 }
501
502 throw new Main\SystemException();
503 }
504
509 public static function getSettings($modelId = 0)
510 {
511 $settings = parent::getSettings($modelId);
512 unset($settings['PAYMENT_TYPE']);
513
514 $settings['SERVICE']['ITEMS']['EMAIL'] = [
515 'TYPE' => 'STRING',
516 'LABEL' => Localization\Loc::getMessage('SALE_CASHBOX_ATOL_FARM_SETTINGS_SERVICE_EMAIL_LABEL'),
517 'VALUE' => static::getDefaultServiceEmail()
518 ];
519
520 $settings['INTERACTION'] = [
521 'LABEL' => Localization\Loc::getMessage('SALE_CASHBOX_ATOL_FARM_SETTINGS_INTERACTION'),
522 'ITEMS' => [
523 'MODE_HANDLER' => [
524 'TYPE' => 'ENUM',
525 'LABEL' => Localization\Loc::getMessage('SALE_CASHBOX_ATOL_FARM_SETTINGS_MODE_HANDLER_LABEL'),
526 'OPTIONS' => [
527 static::HANDLER_MODE_ACTIVE => Localization\Loc::getMessage('SALE_CASHBOX_ATOL_FARM_MODE_ACTIVE'),
528 static::HANDLER_MODE_TEST => Localization\Loc::getMessage('SALE_CASHBOX_ATOL_FARM_MODE_TEST'),
529 ]
530 ]
531 ]
532 ];
533
534 return $settings;
535 }
536
541 protected function validateCheckQuery(array $checkData)
542 {
543 $result = new Result();
544
545 if (empty($checkData['receipt']['client']['email']) && empty($checkData['receipt']['client']['phone']))
546 {
547 $result->addError(new Main\Error(Localization\Loc::getMessage('SALE_CASHBOX_ATOL_ERR_EMPTY_PHONE_EMAIL')));
548 }
549
550 foreach ($checkData['receipt']['items'] as $item)
551 {
552 if ($item['vat'] === null)
553 {
554 $result->addError(new Main\Error(Localization\Loc::getMessage('SALE_CASHBOX_ATOL_ERR_EMPTY_TAX')));
555 break;
556 }
557 }
558
559 return $result;
560 }
561
565 public static function getFfdVersion(): ?float
566 {
567 return 1.05;
568 }
569}
static get($moduleId, $name, $default="", $siteId=false)
Определения option.php:30
Определения error.php:15
static loadMessages($file)
Определения loc.php:65
static getMessage($code, $replace=null, $language=null)
Определения loc.php:30
Определения date.php:9
const CALCULATED_SIGN_CONSUMPTION
Определения abstractcheck.php:35
const PAYMENT_TYPE_CASHLESS
Определения abstractcheck.php:40
registerCheck($operation, array $check)
Определения cashboxatolfarm.php:290
buildPositionQuantity(array $item)
Определения cashboxatolfarmv4.php:188
buildPositionPrice(array $item)
Определения cashboxatolfarmv4.php:170
static getSettings($modelId=0)
Определения cashboxatolfarmv4.php:509
printCorrectionImmediately(CorrectionCheck $check)
Определения cashboxatolfarmv4.php:249
buildPositionPaymentObject(array $item)
Определения cashboxatolfarmv4.php:208
buildPositionVatType(array $checkData, array $item)
Определения cashboxatolfarmv4.php:220
buildPosition(array $checkData, array $item)
Определения cashboxatolfarmv4.php:135
buildPositionPaymentMethod(array $checkData)
Определения cashboxatolfarmv4.php:197
checkCorrection(CorrectionCheck $check)
Определения cashboxatolfarmv4.php:338
validateCheckQuery(array $checkData)
Определения cashboxatolfarmv4.php:541
getRequestUrl($operation, $token, array $queryData=array())
Определения cashboxatolfarmv4.php:478
buildCheckQuery(Check $check)
getField($name)
Определения cashbox.php:159
getValueFromSettings($name, $code)
Определения cashbox.php:203
const PAYMENT_OBJECT_EXCISE
Определения check.php:25
const PAYMENT_OBJECT_LOTTERY
Определения check.php:31
const PAYMENT_OBJECT_SOCIAL_INSURANCE
Определения check.php:47
const PAYMENT_OBJECT_COMPOSITE
Определения check.php:35
const PAYMENT_OBJECT_LOTTERY_PRIZE
Определения check.php:32
const PAYMENT_OBJECT_MEDICAL_INSURANCE_IP
Определения check.php:45
const PAYMENT_OBJECT_COMMODITY_MARKING_EXCISE
Определения check.php:50
const PAYMENT_OBJECT_NON_OPERATING_GAIN
Определения check.php:38
getDataForCheck()
Определения check.php:238
const PAYMENT_OBJECT_COMMODITY_MARKING_NO_MARKING_EXCISE
Определения check.php:49
const PAYMENT_OBJECT_RESORT_FEE
Определения check.php:40
const PAYMENT_OBJECT_PENSION_INSURANCE_IP
Определения check.php:43
const PAYMENT_OBJECT_PROPERTY_RIGHT
Определения check.php:37
const PAYMENT_OBJECT_GAMBLING_PRIZE
Определения check.php:30
const PAYMENT_OBJECT_COMMODITY_MARKING
Определения check.php:52
const PAYMENT_OBJECT_COMMODITY
Определения check.php:24
const PAYMENT_OBJECT_AGENT_COMMISSION
Определения check.php:34
const PAYMENT_OBJECT_ANOTHER
Определения check.php:36
const PAYMENT_OBJECT_DEPOSIT
Определения check.php:41
const PAYMENT_OBJECT_MEDICAL_INSURANCE
Определения check.php:46
const PAYMENT_OBJECT_SERVICE
Определения check.php:27
const PAYMENT_OBJECT_INTELLECTUAL_ACTIVITY
Определения check.php:33
const PAYMENT_OBJECT_PAYMENT
Определения check.php:28
const PAYMENT_OBJECT_EXPENSE
Определения check.php:42
const PAYMENT_OBJECT_GAMBLING_BET
Определения check.php:29
const PAYMENT_OBJECT_CASINO_PAYMENT
Определения check.php:48
const PAYMENT_OBJECT_PENSION_INSURANCE
Определения check.php:44
const PAYMENT_OBJECT_JOB
Определения check.php:26
const PAYMENT_OBJECT_COMMODITY_MARKING_NO_MARKING
Определения check.php:51
const PAYMENT_OBJECT_SALES_TAX
Определения check.php:39
static getType()
Определения creditcheck.php:20
static getType()
Определения sellcheck.php:19
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
buildCorrectionCheckQuery(CorrectionCheck $check)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
NormalizePhone($number, $minLength=10)
Определения tools.php:4959
$map
Определения config.php:5
Определения collection.php:2
$payment
Определения payment.php:14
$email
Определения payment.php:49
$settings
Определения product_settings.php:43
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$vat
Определения template.php:273
$vatList
Определения yandex_run.php:916