Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 13.06 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Prodvigaeff\Atol;
  4.  
  5.  
  6. class Atol4_1 extends Driver
  7. {
  8.    
  9.     public $arSettings = array();
  10.     public $host = "https://online.atol.ru/possystem/v4/";
  11.    
  12.     public function __construct()
  13.     {
  14.         $this->getSettings();
  15.         $this->auth();
  16.     }
  17.    
  18.    
  19.     public function get($url) {
  20.         $c = file_get_contents($url);
  21.        
  22.         $arJson = json_decode($c, true);       
  23.        
  24.         return $arJson;
  25.     }
  26.    
  27.     public function post($url, $arData) {
  28.    
  29.    
  30.         $ch = curl_init($url);
  31.        
  32.         curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-type: application/json; charset=utf-8"));
  33.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  34.         curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($arData) );
  35.  
  36.         $response = curl_exec($ch);
  37.  
  38.         curl_close($ch);
  39.    
  40.         $arJson = json_decode($response, true);    
  41.         return $arJson;
  42.     }
  43.    
  44.  
  45.     public function getSettings()
  46.     {
  47.         $fn = $_SERVER["DOCUMENT_ROOT"].ATOL_XML;
  48.        
  49.         $xml = simplexml_load_file( $fn );
  50.        
  51.         $json = json_encode($xml);
  52.         $array = json_decode($json,TRUE);
  53.        
  54.         $this->arSettings = array(
  55.             "LOGIN"         =>  $array["shop"]["access"]["@attributes"]["login"],
  56.             "PASSWORD"      =>  $array["shop"]["access"]["@attributes"]["password"],
  57.             "GROUP_CODE"    =>  $array["shop"]["access"]["@attributes"]["group_code"],
  58.             "INN"           =>  $array["@attributes"]["INN"],
  59.             "KPP"           =>  $array["@attributes"]["KPP"],
  60.             "hostname"      =>  $array["shop"]["@attributes"]["hostname"],
  61.         );
  62.     }
  63.    
  64.     public function auth()
  65.     {
  66.         $url = $this->host."getToken?login=".$this->arSettings["LOGIN"]."&pass=".$this->arSettings["PASSWORD"];
  67.         $arRes = $this->get($url);
  68.        
  69.         /*
  70.         $url = $this->host."getToken";
  71.         $arData = array(
  72.             "login" =>  $this->arSettings["LOGIN"],
  73.             "pass"  =>  $this->arSettings["PASSWORD"],
  74.         );
  75.        
  76.         $arRes = $this->post($url, $arData);
  77.         */
  78.        
  79.         //var_dump($arRes);
  80.        
  81.         if ($arRes["token"]) {
  82.             $this->arSettings["TOKEN"] = $arRes["token"];
  83.         }
  84.     }
  85.    
  86.    
  87.     public function showSettings()
  88.     {
  89.         echo "<pre>";
  90.         print_r( $this->arSettings );
  91.         echo "</pre>";
  92.     }  
  93.    
  94.    
  95.     function make10($number) {
  96.         return str_pad($number, 10, '0', STR_PAD_LEFT);
  97.     }
  98.    
  99.    
  100.  
  101.     public function getItemInfo($itemID)  {
  102.        
  103.         $iblockID=false;
  104.         $arItem = false;
  105.        
  106.         $resID = \CIBlockElement::GetByID($itemID);
  107.         if($ar_res = $resID->GetNext()) {
  108.             $iblockID=$ar_res["IBLOCK_ID"];
  109.         }
  110.        
  111.        
  112.         if ($iblockID==\CHelpers::getIBlockID('unconfirmed_payments')) {
  113.            
  114.             $arFilter = Array(
  115.                 "ID"=>IntVal($itemID),
  116.                 "IBLOCK_ID"=>$iblockID,
  117.                 "ACTIVE"=>"",
  118.             );
  119.             $arSelect = array(
  120.                 "ID",
  121.                 "DATE_ACTIVE_FROM",
  122.                 "PROPERTY_ls",
  123.                 "PROPERTY_uuid",
  124.                 "PROPERTY_NOTIFICATION",
  125.                 "PROPERTY_EMAIL",
  126.                 "PROPERTY_PHONE",
  127.                 "PROPERTY_pay_value",
  128.                 "property_source",
  129.                 "property_SIMPLE_ID",
  130.             );
  131.             $res = \CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
  132.             if ($ar_fields = $res->GetNext()) {
  133.                 $arItem=array(
  134.                     "LS" => $ar_fields["PROPERTY_LS_VALUE"],
  135.                     "DATE_ACTIVE_FROM" => $ar_fields["DATE_ACTIVE_FROM"],
  136.                     "uuid" => $ar_fields["PROPERTY_UUID_VALUE"],
  137.                     "NOTIFICATION" => $ar_fields["PROPERTY_NOTIFICATION_VALUE"],
  138.                     "EMAIL" => $ar_fields["PROPERTY_EMAIL_VALUE"],
  139.                     "PHONE" => $ar_fields["PROPERTY_PHONE_VALUE"],
  140.                     "PAY_VALUE" => floatval($ar_fields["PROPERTY_PAY_VALUE_VALUE"]),
  141.                     "SOURCE" => $ar_fields["PROPERTY_SOURCE_VALUE"],
  142.                     "SIMPLE_ID"=> $ar_fields["PROPERTY_SIMPLE_ID_VALUE"],
  143.                 );
  144.             }              
  145.            
  146.         }
  147.        
  148.         if ($iblockID==\CHelpers::getIBlockID('unconfirmed_payments_ul')) {
  149.        
  150.             $arFilter = Array(
  151.                 "ID"=>IntVal($itemID),
  152.                 "IBLOCK_ID"=>$iblockID,
  153.                 "ACTIVE"=>"",
  154.             );
  155.             $arSelect = array(
  156.                 "ID",
  157.                 "DATE_ACTIVE_FROM",
  158.                 "PROPERTY_contract_id",
  159.                 "PROPERTY_amount",
  160.                 "PROPERTY_uuid",
  161.                 "PROPERTY_NOTIFICATION",
  162.                 "PROPERTY_EMAIL",
  163.                 "PROPERTY_PHONE",
  164.             );
  165.             $res = \CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
  166.             if ($ar_fields = $res->GetNext()) {
  167.                 $arItem=array(
  168.                     "LS" => $ar_fields["PROPERTY_CONTRACT_ID_VALUE"],
  169.                     "DATE_ACTIVE_FROM" => $ar_fields["DATE_ACTIVE_FROM"],
  170.                     "uuid" => $ar_fields["PROPERTY_UUID_VALUE"],
  171.                     "NOTIFICATION" => $ar_fields["PROPERTY_NOTIFICATION_VALUE"],
  172.                     "EMAIL" => $ar_fields["PROPERTY_EMAIL_VALUE"],
  173.                     "PHONE" => $ar_fields["PROPERTY_PHONE_VALUE"],
  174.                     "PAY_VALUE" => floatval($ar_fields["PROPERTY_AMOUNT_VALUE"]),
  175.                     "SOURCE" => "lk",
  176.                     "SIMPLE_ID"=> false,
  177.                 );
  178.             }      
  179.            
  180.         }
  181.        
  182.         return $arItem;
  183.  
  184.     }
  185.  
  186.    
  187.    
  188.     public function getInfo($uuid) {
  189.        
  190.         $url = $this->host.$this->arSettings["GROUP_CODE"]."/report/".$uuid."/?token=".$this->arSettings["TOKEN"];
  191.         $arRes = $this->get($url);
  192.         //var_dump($url);
  193.        
  194.         $arRes["payload"]["fiscal_document_attribute"] = self::make10( $arRes["payload"]["fiscal_document_attribute"] );
  195.        
  196.         return $arRes;
  197.         //pre($arRes);
  198.  
  199.     }
  200.    
  201.    
  202.     // https://online.atol.ru/files/API_FFD_1-0-5.pdf
  203.     public function sendCheck($itemID)
  204.     {
  205.    
  206.         $arData = array();
  207.        
  208.         $arItem = self::getItemInfo($itemID);
  209.        
  210.         if (!$arItem["LS"]) {
  211.             return false;
  212.         }
  213.        
  214.         $UF_CHECK_DELIVERY = "email";
  215.         $arUser=array(
  216.             "EMAIL"              => "simplepay@bashesk.ru",
  217.             "PERSONAL_PHONE"     => "",
  218.         );
  219.        
  220.         if ($arItem["SOURCE"]=="simple") {
  221.            
  222.             if ($arItem["SIMPLE_ID"]) {
  223.                
  224.                 $rsElement = \CIBlockElement::GetList(
  225.                         false,
  226.                         array('IBLOCK_ID' => \CHelpers::getIBlockID('simple_payments'), 'ID' => $arItem["SIMPLE_ID"]),
  227.                         false,
  228.                         false,
  229.                         array("ID", "NAME", "PROPERTY_NOTIFICATION", "PROPERTY_EMAIL", "PROPERTY_PHONE")
  230.                 );
  231.  
  232.                 if ($arElement = $rsElement->getNext()) {
  233.                    
  234.                     if ($arElement["PROPERTY_NOTIFICATION_VALUE"]) {
  235.                         $UF_CHECK_DELIVERY = $arElement["PROPERTY_NOTIFICATION_VALUE"];
  236.                     }
  237.                    
  238.                     if ($arElement["PROPERTY_EMAIL_VALUE"]) {
  239.                         $arUser["EMAIL"] = $arElement["PROPERTY_EMAIL_VALUE"];
  240.                     }
  241.  
  242.                     if ($arElement["PROPERTY_PHONE_VALUE"]) {
  243.                         $arUser["PERSONAL_PHONE"] = $arElement["PROPERTY_PHONE_VALUE"];
  244.                     }
  245.                    
  246.                 }
  247.                
  248.             }
  249.            
  250.         } else {
  251.  
  252.             $res = \Bitrix\Main\UserTable::getList(
  253.                 Array(
  254.                     "select"=>Array("ID","NAME", "UF_CHECK_DELIVERY", "EMAIL", "PERSONAL_PHONE"),
  255.                     "filter"=>Array("UF_CONTRACTS_LIST"=>$arItem["LS"]),
  256.                 )
  257.             );
  258.             if ($arRes = $res->fetch()) {
  259.                //pre($arRes);
  260.                if ($arRes["EMAIL"]) {
  261.                    $arUser["EMAIL"] = $arRes["EMAIL"];
  262.                }
  263.                if ($arRes["PERSONAL_PHONE"]) {
  264.                    $arUser["PERSONAL_PHONE"] = $arRes["PERSONAL_PHONE"];
  265.                }
  266.                if ($arRes["UF_CHECK_DELIVERY"]) {
  267.                   $UF_CHECK_DELIVERY = $arRes["UF_CHECK_DELIVERY"];
  268.                }
  269.             }
  270.        
  271.             //$rsUser = \CUser::GetByLogin($arItem["LS"]);
  272.             //$arUser = $rsUser->Fetch();
  273.            
  274.        
  275.         }
  276.        
  277.         if ($arUser["UF_CHECK_DELIVERY"]=="phone" && $arUser["PERSONAL_PHONE"]) {
  278.             $UF_CHECK_DELIVERY = "phone";
  279.         }
  280.        
  281.         //pre( $arItem );   pre( $arUser ); pre($UF_CHECK_DELIVERY);
  282.            
  283.        
  284.         $arData["external_id"] = "ID-".$itemID; //уникальный среди всех документов
  285.        
  286.         $arData["receipt"]["client"] = array(
  287.             "email"     =>  $arUser["EMAIL"],
  288.             "phone"     =>  $arUser["PERSONAL_PHONE"],
  289.         );
  290.        
  291.        
  292.         $arData["receipt"]["company"] = array(
  293.             "email"             =>  'simplepay@bashesk.ru',
  294.             "inn"               =>  '0275038496',
  295.             "payment_address"   =>  'https://bashesk.ru/', //Место расчетов.
  296.         );     
  297.  
  298.         $arData["receipt"]["items"][] = array(
  299.             "name"      =>  "За электроэнергию по договору №".$arItem["LS"],
  300.             "price"     =>  $arItem["PAY_VALUE"],
  301.             "quantity"  =>  1,
  302.             "sum"       =>  $arItem["PAY_VALUE"],
  303.             //"vat"     =>  array( "type" => "vat118" ), //НДС чека по расчетной ставке 18/118
  304.             "vat"       =>  array( "type" => "vat120" ), //НДС чека по расчетной ставке 20/120
  305.             //"tax_sum" =>  0,
  306.         );
  307.        
  308.  
  309.         $arData["receipt"]["payments"][]= array(
  310.             "sum"       =>  $arItem["PAY_VALUE"],
  311.             "type"      =>  1,  //«1» – электронный;
  312.         ); 
  313.  
  314.         $arData["receipt"]["total"] = $arItem["PAY_VALUE"];
  315.  
  316.         $arData["service"]= array(
  317.             "callback_url"      =>  "https://bashesk.ru/user/pay/sms.php",
  318.             "inn"               =>  $this->arSettings["INN"],
  319.             "payment_address"   =>  $this->arSettings["hostname"],
  320.         ); 
  321.        
  322.         //$arData["timestamp"] = date("d.m.Y H:i:s");  
  323.         $arData["timestamp"] = $arItem["DATE_ACTIVE_FROM"];
  324.        
  325.         //pre( $arData );// exit;
  326.        
  327.         \CHelpers::writeLog( "arData" );
  328.         \CHelpers::writeLog( $arData );
  329.        
  330.         $url = $this->host.$this->arSettings["GROUP_CODE"]."/sell?token=".$this->arSettings["TOKEN"];
  331.         $arRes = $this->post($url, $arData);
  332.        
  333.         //pre($arRes);
  334.  
  335.         \CHelpers::writeLog( "arRes" );
  336.         \CHelpers::writeLog( $arRes );
  337.  
  338.         $uuid = $arRes["uuid"];
  339.        
  340.        
  341.         \CIBlockElement::SetPropertyValuesEx($itemID, false, array("uuid" => $uuid));
  342.         \CIBlockElement::SetPropertyValuesEx($itemID, false, array("NOTIFICATION" => $UF_CHECK_DELIVERY));
  343.  
  344.         \CIBlockElement::SetPropertyValuesEx($itemID, false, array("EMAIL" => $arUser["EMAIL"]          ));
  345.         \CIBlockElement::SetPropertyValuesEx($itemID, false, array("PHONE" => $arUser["PERSONAL_PHONE"] ));
  346.        
  347.         /*
  348.         if ($UF_CHECK_DELIVERY=="phone") {
  349.            
  350.             sleep(5);
  351.             $arInfo = $this->getInfo($uuid);
  352.            
  353.             if ($arInfo["status"]=="done") {
  354.                 //$message = "ESKB. Успешная оплата ".$arItem["PAY_VALUE"]."руб. по договору ".$arItem["LS"];
  355.                 //$arData["timestamp"] = '';
  356.                 $message =  'В ООО "ЭСКБ" '.$arData["timestamp"].' '.
  357.                             'поступила оплата за электроэнергию на '.$arItem["PAY_VALUE"].' руб. '.
  358.                             'Проверить можно ОФД https://ofd-ya.ru/check '.
  359.                             'ФН: ' .$arInfo["payload"]["ecr_registration_number"].'; '.
  360.                             'ФД: ' .$arInfo["payload"]["fiscal_document_number"].'; '.
  361.                             'ФПД: '.$arInfo["payload"]["fiscal_document_attribute"].'.';
  362.                
  363.                 //echo $message;
  364.                 \CHelpers::writeLog( "message" );
  365.                 \CHelpers::writeLog( $message );
  366.                
  367.                 $basheskUser = new \CBasheskUser();
  368.                 $basheskUser->sendSMS($arUser["PERSONAL_PHONE"], $message);
  369.                
  370.             }
  371.            
  372.         }
  373.         */
  374.        
  375.        
  376.     }
  377.    
  378.    
  379.  
  380.     public function setStatus() {
  381.        
  382.  
  383.  
  384.         $arItems = array();
  385.        
  386.         // FL
  387.         $arFilter = Array(
  388.             "IBLOCK_ID"=>\CHelpers::getIBlockID('unconfirmed_payments'),
  389.             "ACTIVE"=>"",
  390.             ">DATE_ACTIVE_FROM"=>"01.04.2018",
  391.             "!PROPERTY_uuid"=>false,
  392.             "!PROPERTY_CHECK_STATUS"=>'done',
  393.         );
  394.         $arSelect = array("ID");
  395.  
  396.         $res = \CIBlockElement::GetList(array("ID"=>"asc"), $arFilter, false, array("nTopCount"=>20), $arSelect);
  397.         while($arItem = $res->GetNext()) {
  398.  
  399.             $arItems[$arItem["ID"]]=array(
  400.                 "ID"   => $arItem["ID"],
  401.                 "USER_TYPE" => "FL",
  402.             );
  403.  
  404.         }
  405.        
  406.         //UL
  407.         $arFilter = Array(
  408.             "IBLOCK_ID"=>\CHelpers::getIBlockID('unconfirmed_payments_ul'),
  409.             "ACTIVE"=>"",
  410.             ">DATE_ACTIVE_FROM"=>"01.04.2018",
  411.             "!PROPERTY_uuid"=>false,
  412.             "!PROPERTY_CHECK_STATUS"=>'done',
  413.         );
  414.         $arSelect = array("ID", "PROPERTY_ls", "PROPERTY_uuid");
  415.  
  416.         $res = \CIBlockElement::GetList(false, $arFilter, false, array("nTopCount"=>20), $arSelect);
  417.         while($arItem = $res->GetNext()) {
  418.            
  419.             $arItems[$arItem["ID"]]=array(
  420.                 "ID"   => $arItem["ID"],
  421.                 "USER_TYPE" => "FL",
  422.             );
  423.            
  424.         }  
  425.        
  426.        
  427.         foreach ($arItems as $itemID=>$arItem) {
  428.            
  429.             //$arItems
  430.             //$arItems
  431.             $arItem["IBLOCK_INFO"] = $this->getItemInfo($itemID);
  432.             $uuid = $arItem["IBLOCK_INFO"]["uuid"];
  433.            
  434.             if ($uuid) {
  435.                
  436.                 $arItem["CHECK_INFO"] = $this->getInfo($uuid);
  437.                
  438.                 if (!$arItem["CHECK_INFO"]["status"]) {
  439.                      $arItem["CHECK_INFO"]["status"] = 'none';
  440.                 }
  441.  
  442.                  \CIBlockElement::SetPropertyValuesEx($arItem["ID"], false, array("CHECK_STATUS" => $arItem["CHECK_INFO"]["status"]));
  443.  
  444.                 if ($arItem["IBLOCK_INFO"]["NOTIFICATION"]=="phone" &&
  445.                     $arItem["CHECK_INFO"]["status"]=="done" &&
  446.                     $arItem["IBLOCK_INFO"]["PHONE"]!='' ){
  447.                
  448.                        
  449.                     $message =  'В ООО "ЭСКБ" '.$arItem["IBLOCK_INFO"]["DATE_ACTIVE_FROM"].' '.
  450.                                 'поступила оплата за электроэнергию на '.$arItem["IBLOCK_INFO"]["PAY_VALUE"].' руб. '.
  451.                                 'Проверить можно ОФД https://ofd-ya.ru/check '.
  452.                                 'ФН: ' .$arItem["CHECK_INFO"]["payload"]["ecr_registration_number"].'; '.
  453.                                 'ФД: ' .$arItem["CHECK_INFO"]["payload"]["fiscal_document_number"].'; '.
  454.                                 'ФПД: '.$arItem["CHECK_INFO"]["payload"]["fiscal_document_attribute"].'.';
  455.                                
  456.                     $arItem["MESSAGE"] = $message;
  457.                    
  458.                     $basheskUser = new \CBasheskUser();
  459.                     $basheskUser->sendSMS($arItem["IBLOCK_INFO"]["PHONE"], $message);
  460.                
  461.                     \CHelpers::writeLog( "message" );
  462.                     \CHelpers::writeLog( $arItem["IBLOCK_INFO"]["PHONE"] );
  463.                     \CHelpers::writeLog( $message );
  464.                        
  465.                 }
  466.            
  467.             }
  468.            
  469.            
  470.             $arItems[$itemID] = $arItem;
  471.         }
  472.        
  473.         //pre($arItems);
  474.        
  475.     }  
  476.    
  477.    
  478.     public static function setStatusAgent() {
  479.         //return "\Prodvigaeff\Atol\Atol4_1::setStatusAgent();";
  480.        
  481.         \CModule::IncludeModule("iblock");
  482.         set_time_limit(0);
  483.        
  484.         $atol = new \Prodvigaeff\Atol\Atol4_1();
  485.         $atol->setStatus();
  486.        
  487.         return "\Prodvigaeff\Atol\Atol4_1::setStatusAgent();";
  488.     }
  489.    
  490.    
  491. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement