PageRenderTime 41ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/sale/lib/cashbox/cashboxbitrixv2.php

https://gitlab.com/alexprowars/bitrix
PHP | 406 lines | 301 code | 42 blank | 63 comment | 14 complexity | 48884f6f31338700d4565a5b8b90fd7f MD5 | raw file
  1. <?php
  2. namespace Bitrix\Sale\Cashbox;
  3. use Bitrix\Main;
  4. use Bitrix\Catalog;
  5. use Bitrix\Main\Localization;
  6. Localization\Loc::loadMessages(__FILE__);
  7. /**
  8. * Class CashboxBitrixV2
  9. * @package Bitrix\Sale\Cashbox
  10. */
  11. class CashboxBitrixV2 extends CashboxBitrix
  12. {
  13. const CODE_VAT_0 = 'vat0';
  14. const CODE_VAT_10 = 'vat10';
  15. const CODE_VAT_20 = 'vat20';
  16. const CODE_CALC_VAT_10 = 'vat110';
  17. const CODE_CALC_VAT_20 = 'vat120';
  18. /**
  19. * @param Check $check
  20. * @return array
  21. * @throws Main\ArgumentException
  22. * @throws Main\ArgumentNullException
  23. * @throws Main\ArgumentOutOfRangeException
  24. * @throws Main\ArgumentTypeException
  25. * @throws Main\LoaderException
  26. * @throws Main\NotImplementedException
  27. * @throws Main\ObjectException
  28. * @throws Main\ObjectPropertyException
  29. * @throws Main\SystemException
  30. */
  31. public function buildCheckQuery(Check $check)
  32. {
  33. $data = $check->getDataForCheck();
  34. /** @var Main\Type\DateTime $dateTime */
  35. $dateTime = $data['date_create'];
  36. $phone = \NormalizePhone($data['client_phone']);
  37. if (is_string($phone))
  38. {
  39. if ($phone[0] === '7')
  40. $phone = '+'.$phone;
  41. }
  42. else
  43. {
  44. $phone = '';
  45. }
  46. $client = $data['client_email'];
  47. if ($this->getValueFromSettings('CLIENT', 'INFO') === 'PHONE'
  48. && $phone
  49. )
  50. {
  51. $client = $phone;
  52. }
  53. $result = [
  54. 'type' => $check::getCalculatedSign() === Check::CALCULATED_SIGN_INCOME ? 'sell' : 'sellReturn',
  55. 'timestamp' => $dateTime->format('d.m.Y H:i:s'),
  56. 'external_id' => static::buildUuid(static::UUID_TYPE_CHECK, $data['unique_id']),
  57. 'taxationType' => $this->getValueFromSettings('TAX', 'SNO'),
  58. 'zn' => (string)$this->getField('NUMBER_KKM'),
  59. 'clientInfo' => [
  60. 'emailOrPhone' => $client,
  61. ],
  62. 'payments' => [],
  63. 'items' => [],
  64. 'total' => (float)$data['total_sum']
  65. ];
  66. foreach ($data['payments'] as $payment)
  67. {
  68. $result['payments'][] = [
  69. 'type' => $this->getValueFromSettings('PAYMENT_TYPE', $payment['type']),
  70. 'sum' => (float)$payment['sum']
  71. ];
  72. }
  73. foreach ($data['items'] as $item)
  74. {
  75. $result['items'][] = $this->buildPosition($data, $item);
  76. }
  77. return $result;
  78. }
  79. protected function buildPosition(array $checkData, array $item)
  80. {
  81. $checkTypeMap = $this->getCheckTypeMap();
  82. $paymentObjectMap = $this->getPaymentObjectMap();
  83. $vat = $this->getValueFromSettings('VAT', $item['vat']);
  84. if ($vat === null)
  85. {
  86. $vat = $this->getValueFromSettings('VAT', 'NOT_VAT');
  87. }
  88. $position = [
  89. 'type' => 'position',
  90. 'name' => $item['name'],
  91. 'price' => (float)$item['price'],
  92. 'quantity' => $item['quantity'],
  93. 'amount' => (float)$item['sum'],
  94. 'paymentMethod' => $checkTypeMap[$checkData['type']],
  95. 'paymentObject' => $paymentObjectMap[$item['payment_object']],
  96. 'tax' => [
  97. 'type' => $this->mapVatValue($checkData['type'], $vat)
  98. ],
  99. ];
  100. if (isset($item['supplier_info']))
  101. {
  102. $position['supplierInfo'] = [
  103. 'phones' => $item['supplier_info']['phones'],
  104. 'name' => $item['supplier_info']['name'],
  105. 'vatin' => $item['supplier_info']['inn']
  106. ];
  107. }
  108. if (isset($item['nomenclature_code']))
  109. {
  110. $position['nomenclatureCode'] = base64_encode($item['nomenclature_code']);
  111. }
  112. return $position;
  113. }
  114. /**
  115. * @param $checkType
  116. * @param $vat
  117. * @return mixed
  118. */
  119. protected function mapVatValue($checkType, $vat)
  120. {
  121. $map = [
  122. self::CODE_VAT_10 => [
  123. PrepaymentCheck::getType() => self::CODE_CALC_VAT_10,
  124. PrepaymentReturnCheck::getType() => self::CODE_CALC_VAT_10,
  125. PrepaymentReturnCashCheck::getType() => self::CODE_CALC_VAT_10,
  126. FullPrepaymentCheck::getType() => self::CODE_CALC_VAT_10,
  127. FullPrepaymentReturnCheck::getType() => self::CODE_CALC_VAT_10,
  128. FullPrepaymentReturnCashCheck::getType() => self::CODE_CALC_VAT_10,
  129. ],
  130. self::CODE_VAT_20 => [
  131. PrepaymentCheck::getType() => self::CODE_CALC_VAT_20,
  132. PrepaymentReturnCheck::getType() => self::CODE_CALC_VAT_20,
  133. PrepaymentReturnCashCheck::getType() => self::CODE_CALC_VAT_20,
  134. FullPrepaymentCheck::getType() => self::CODE_CALC_VAT_20,
  135. FullPrepaymentReturnCheck::getType() => self::CODE_CALC_VAT_20,
  136. FullPrepaymentReturnCashCheck::getType() => self::CODE_CALC_VAT_20,
  137. ],
  138. ];
  139. return $map[$vat][$checkType] ?? $vat;
  140. }
  141. /**
  142. * @return array
  143. */
  144. protected function getPaymentObjectMap()
  145. {
  146. return [
  147. Check::PAYMENT_OBJECT_COMMODITY => 'commodity',
  148. Check::PAYMENT_OBJECT_SERVICE => 'service',
  149. Check::PAYMENT_OBJECT_JOB => 'job',
  150. Check::PAYMENT_OBJECT_EXCISE => 'excise',
  151. Check::PAYMENT_OBJECT_PAYMENT => 'payment',
  152. Check::PAYMENT_OBJECT_GAMBLING_BET => 'gamblingBet',
  153. Check::PAYMENT_OBJECT_GAMBLING_PRIZE => 'gamblingPrize',
  154. Check::PAYMENT_OBJECT_LOTTERY => 'lottery',
  155. Check::PAYMENT_OBJECT_LOTTERY_PRIZE => 'lotteryPrize',
  156. Check::PAYMENT_OBJECT_INTELLECTUAL_ACTIVITY => 'intellectualActivity',
  157. Check::PAYMENT_OBJECT_AGENT_COMMISSION => 'agentCommission',
  158. Check::PAYMENT_OBJECT_COMPOSITE => 'composite',
  159. Check::PAYMENT_OBJECT_ANOTHER => 'another',
  160. Check::PAYMENT_OBJECT_PROPERTY_RIGHT => 'proprietaryLaw',
  161. Check::PAYMENT_OBJECT_NON_OPERATING_GAIN => 'nonOperatingIncome',
  162. Check::PAYMENT_OBJECT_SALES_TAX => 'merchantTax',
  163. Check::PAYMENT_OBJECT_RESORT_FEE => 'resortFee',
  164. Check::PAYMENT_OBJECT_COMMODITY_MARKING_NO_MARKING_EXCISE => 'excise',
  165. Check::PAYMENT_OBJECT_COMMODITY_MARKING_EXCISE => 'excise',
  166. Check::PAYMENT_OBJECT_COMMODITY_MARKING_NO_MARKING => 'commodity',
  167. Check::PAYMENT_OBJECT_COMMODITY_MARKING => 'commodity',
  168. ];
  169. }
  170. /**
  171. * @return string
  172. */
  173. public static function getName()
  174. {
  175. return Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_TITLE');
  176. }
  177. /**
  178. * @return array
  179. */
  180. protected function getCheckTypeMap()
  181. {
  182. return [
  183. SellCheck::getType() => 'fullPayment',
  184. SellReturnCashCheck::getType() => 'fullPayment',
  185. SellReturnCheck::getType() => 'fullPayment',
  186. AdvancePaymentCheck::getType() => 'advance',
  187. AdvanceReturnCashCheck::getType() => 'advance',
  188. AdvanceReturnCheck::getType() => 'advance',
  189. CreditCheck::getType() => 'credit',
  190. CreditReturnCheck::getType() => 'credit',
  191. CreditPaymentCheck::getType() => 'creditPayment',
  192. CreditPaymentReturnCashCheck::getType() => 'creditPayment',
  193. CreditPaymentReturnCheck::getType() => 'creditPayment',
  194. PrepaymentCheck::getType() => 'prepayment',
  195. PrepaymentReturnCheck::getType() => 'prepayment',
  196. PrepaymentReturnCashCheck::getType() => 'prepayment',
  197. FullPrepaymentCheck::getType() => 'fullPrepayment',
  198. FullPrepaymentReturnCheck::getType() => 'fullPrepayment',
  199. FullPrepaymentReturnCashCheck::getType() => 'fullPrepayment',
  200. ];
  201. }
  202. /**
  203. * @param int $modelId
  204. * @return array
  205. */
  206. public static function getSettings($modelId = 0)
  207. {
  208. $settings = parent::getSettings($modelId);
  209. $kkmList = static::getSupportedKkmModels();
  210. if (isset($kkmList[$modelId]))
  211. {
  212. $settings['TAX'] = [
  213. 'LABEL' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SETTINGS_SNO'),
  214. 'REQUIRED' => 'Y',
  215. 'ITEMS' => [
  216. 'SNO' => [
  217. 'TYPE' => 'ENUM',
  218. 'LABEL' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SETTINGS_SNO_LABEL'),
  219. 'VALUE' => 'osn',
  220. 'OPTIONS' => [
  221. 'osn' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SNO_OSN'),
  222. 'usnIncome' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SNO_UI'),
  223. 'usnIncomeOutcome' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SNO_UIO'),
  224. 'envd' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SNO_ENVD'),
  225. 'esn' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SNO_ESN'),
  226. 'patent' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SNO_PATENT')
  227. ]
  228. ]
  229. ]
  230. ];
  231. }
  232. $settings['CLIENT'] = [
  233. 'LABEL' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SETTINGS_CLIENT'),
  234. 'ITEMS' => [
  235. 'INFO' => [
  236. 'TYPE' => 'ENUM',
  237. 'VALUE' => 'NONE',
  238. 'LABEL' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SETTINGS_CLIENT_INFO'),
  239. 'OPTIONS' => [
  240. 'EMAIL' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SETTINGS_CLIENT_EMAIL'),
  241. 'PHONE' => Localization\Loc::getMessage('SALE_CASHBOX_BITRIX_V2_SETTINGS_CLIENT_PHONE'),
  242. ]
  243. ],
  244. ]
  245. ];
  246. return $settings;
  247. }
  248. /**
  249. * @param Main\HttpRequest $request
  250. * @return array
  251. */
  252. public static function extractSettingsFromRequest(Main\HttpRequest $request)
  253. {
  254. return $request->get('SETTINGS');
  255. }
  256. /**
  257. * @return array
  258. */
  259. public static function getSupportedKkmModels()
  260. {
  261. return [
  262. 'atol' => [
  263. 'NAME' => 'ATOL',
  264. 'SETTINGS' => [
  265. 'VAT' => [
  266. 'NOT_VAT' => 'none',
  267. 0 => self::CODE_VAT_0,
  268. 10 => self::CODE_VAT_10,
  269. 20 => self::CODE_VAT_20
  270. ],
  271. 'PAYMENT_TYPE' => [
  272. Check::PAYMENT_TYPE_CASH => 'cash',
  273. Check::PAYMENT_TYPE_CASHLESS => 'electronically',
  274. Check::PAYMENT_TYPE_ADVANCE => 'prepaid',
  275. Check::PAYMENT_TYPE_CREDIT => 'credit'
  276. ]
  277. ]
  278. ],
  279. ];
  280. }
  281. /**
  282. * @inheritDoc
  283. */
  284. public static function getFfdVersion(): ?float
  285. {
  286. return 1.05;
  287. }
  288. /**
  289. * @param array $data
  290. * @return array
  291. * @throws Main\ArgumentException
  292. * @throws Main\LoaderException
  293. * @throws Main\ObjectPropertyException
  294. * @throws Main\SystemException
  295. */
  296. public static function getCashboxList(array $data)
  297. {
  298. $result = parent::getCashboxList($data);
  299. foreach ($result as $zn => $cashbox)
  300. {
  301. if (!isset($cashbox['ID']))
  302. {
  303. continue;
  304. }
  305. $current = Manager::getCashboxFromCache($cashbox['ID']);
  306. if ($current['HANDLER'] !== '\\'.static::class)
  307. {
  308. $cashbox['HANDLER'] = '\\'.static::class;
  309. $cashbox['SETTINGS'] = static::convertSettings($cashbox['KKM_ID'], $cashbox['SETTINGS']);
  310. $result[$zn] = $cashbox;
  311. }
  312. }
  313. return $result;
  314. }
  315. /**
  316. * @param $kkmId
  317. * @param array $settings
  318. * @return array
  319. * @throws Main\ArgumentException
  320. * @throws Main\LoaderException
  321. * @throws Main\ObjectPropertyException
  322. * @throws Main\SystemException
  323. */
  324. protected static function convertSettings($kkmId, array $settings)
  325. {
  326. $result = [];
  327. $currentModel = static::getSupportedKkmModels()[$kkmId];
  328. foreach ($settings as $key => $setting)
  329. {
  330. if ($key === 'PAYMENT_TYPE')
  331. {
  332. $result[$key] = $currentModel['SETTINGS']['PAYMENT_TYPE'];
  333. }
  334. elseif ($key === 'VAT')
  335. {
  336. $result[$key]['NOT_VAT']= $currentModel['SETTINGS']['VAT']['NOT_VAT'];
  337. if (Main\Loader::includeModule('catalog'))
  338. {
  339. $dbRes = Catalog\VatTable::getList(array('filter' => array('ACTIVE' => 'Y')));
  340. $vatList = $dbRes->fetchAll();
  341. if ($vatList)
  342. {
  343. foreach ($vatList as $vat)
  344. {
  345. if (isset($currentModel['SETTINGS']['VAT'][(int)$vat['RATE']]))
  346. {
  347. $result[$key][(int)$vat['ID']] = $currentModel['SETTINGS']['VAT'][(int)$vat['RATE']];
  348. }
  349. else
  350. {
  351. $result[$key][(int)$vat['ID']] = $currentModel['SETTINGS']['VAT']['NOT_VAT'];
  352. }
  353. }
  354. }
  355. }
  356. }
  357. else
  358. {
  359. $result[$key] = $setting;
  360. }
  361. }
  362. return $result;
  363. }
  364. }