خبرة في دمج Atol cash desk مع تجارة CRM الخاصة

حول شباك التذاكر على الإنترنت مؤخرًا ، الإثارة الوحشية ، في 1 يوليو 2019 ، ينتهي التأجيل الأخير ، لذلك اضطررت إلى التعامل مع هذه المشكلة. لا يمكن لأولئك الذين لديهم 1C أو أي نظام آخر أن يجهدوا ، لكن إذا كان لديك نظام مكتوب ذاتيًا ، فإن التكامل مع سجلات النقد عبر الإنترنت يقع أيضًا على عاتقك.

تجربتي مفيدة للتكامل مع مكاتب Atol النقدية في وضع تبادل بيانات الشبكة ، يمكن للبرنامج إرسال البيانات إلى خادم الويب Atol على المستضيف المحلي وعلى الشبكة المحلية ، ويمكنك إرسالها حتى من متصفح AJAX ، حتى من الخادم عبر CURL ، وبالتالي ، بغض النظر عن اللغة المكتوبة في برنامج شركتك ، فكل شيء متعدد المنصات.

لقد واجهت مكتب التذاكر في Atol 30f - إنه آلة كاتبة بسيطة بها صندوق أسود (FN) ، يكون الأمر صحيحًا تمامًا عندما يكون كل منطق الطلب على برامج خارجية ، وليس على البرنامج المدمج في أمين الصندوق. بالإضافة إلى ذلك ، تعتبر الأجهزة من هذا النوع غير مكلفة نسبيًا ، مقارنةً بنظيراتها العاملة بنظام أندرويد.

أود أيضًا أن أشير إلى أن "المتخصصين" في بعض الشركات المشاركة في الدعم لا يعرفون مطلقًا أن Atoll مع الإصدار 10 يحتوي على خادم ويب مضمن في برنامج التشغيل الذي يقبل وظائف JSON ، علاوة على ذلك ، يمكن أيضًا تثبيت برنامج التشغيل هذا على نظام تشغيل linux من خلال عدد الحلول الجاهزة على التوت ، يمكنني أن أفترض أنه يمكن أيضًا تثبيتها هناك ، عند توزيع الإصدار العاشر من برنامج التشغيل ، يوجد مثبت الذراع.

المخطط المخطط يشبه هذا - هناك CRM يتم تشغيله على الخادم على الشبكة المحلية ، ويتم فتحه من المتصفحات ، وسيتم إرسال الشيكات من جانب الخادم إلى PHP من خلال الضفيرة وطباعتها في السجل النقدي. ومكتب النقدية نفسه متصل بأي كمبيوتر على Windows على نفس الشبكة.

يقولون أنه إذا لم تقم بتنشيط أمين الصندوق ، فيمكنه العمل في وضع الطابعة وطباعة أن الشيك غير صالح ، لكني لم أتمكن من التحقق منه ، كان علي أن أقوم بمبيعات وعوائد بنس.

يتم تنزيل برنامج تشغيل الإصدار العاشر من هنا .

قبل التثبيت ، ستحتاج إلى تثبيت Java بنفس عمق البت مثل برنامج التشغيل ، وإلا فلن يتوفر خادم الويب لخانة الاختيار ، إذا قمت بتثبيت برنامج تشغيل KKT 64 بت ، ثم Java x64.

يبدو أنك تحتاج منطقياً إلى تثبيت برنامج تشغيل 64 بت على نظام 64 بت ، لكن بعض البرامج ذات 32 بت لن تكون قادرة على التعامل معها (مثل هذا ينطبق على 1C إذا كان 32 بت).



في نهاية التثبيت ، توجد علامة اختيار - لتكوين خادم الويب ، إذا لم يكن مثبتًا ، فأنت بحاجة إلى الانتقال إلى المستعرض على 127.0.0.1 : 16732 / الإعدادات ، حدد مربع "تنشيط الخادم" وحفظه.





بعد ذلك ، تحتاج إلى إعادة تشغيل الخادم من خلال START-> ATOL-> إعادة التشغيل ...

أريد أيضًا أن أحذرك فورًا أنه في حالة بدء تشغيل خادم الويب ، فلن تتمكن التطبيقات المحلية من الوصول إلى CCP ، وأكدح لفترة طويلة ، وقم بتثبيت برنامج التشغيل ، وقم بتشغيل اختبار برنامج تشغيل Cct ، وأخبرني أن المنفذ مشغول وهذا هو ، اتصلت بالدعم الفني للبائع المحلي ، وهناك قالوا إننا لا نعرف ما يجب القيام به ، ثم قمت بتحميل جهاز الكمبيوتر بعشر مرات ، وقمت بإعادة تثبيت برنامج التشغيل ، ولا شيء يساعد.

بشكل عام ، بعد تنشيط الخادم وإعادة تشغيله ، وقبل أن تقوم بإيقاف تشغيل الخادم وتحقق من طباعة النص العادي من خلال الأداة المساعدة المتوفرة ، أو يمكنك فقط التحقق من الاتصال ، يمكنك المتابعة.

لا تحتوي خدمة الويب هذه على أي حماية بكلمة مرور ، لذلك تحتاج إلى تكوين جدار حماية Windows أو البرامج الأخرى على الفور حتى يتمكن فقط أجهزة الكمبيوتر الضرورية من الوصول إلى المنفذ 16732 ، في موقفي هذا هو الخادم الذي يعمل عليه CRM.

التواصل مع خدمة الويب هو موضوع منفصل بشكل عام ومثير للاهتمام ...

  1. توليد uuid فريدة لهذا المنصب
  2. نرسل المهمة باستخدام طريقة POST
  3. نحن نتعطل في خدمة الويب ، في انتظار نتيجة المهمة من خلال UUID ، قد يكون لدينا لبضع ثوان حالة انتظار ، أو قد يحدث خطأ إذا حدث خطأ ما في الطلب ...

وبعد ذلك ، سأقدم نسخة صالحة للعمل ، وهي مناسبة للحالات التي يكون فيها الدفع طريقة واحدة فقط ، وليس جزءًا كبيرًا من النقد وجزء غير نقدي ، ويستخدم أيضًا نظام الضريبة الافتراضي ، ولا يتم حساب ضريبة القيمة المضافة بعد ، أردت إضافة الرمز ، ثم نشره ، ولكن أعتقد أنه لا يزال هناك أشخاص يحتاجون إلى هذه المعلومات قبل 1 تموز (يوليو) من بعد. يجب أن أقول على الفور أن الفصل يحتاج إلى تحسين ، والكثير من الأخطاء ، لا معالجة للخطأ ، لقد تم كل شيء في بضع ساعات دون مراعاة قراءة الوثائق ، وهذا الرمز هو أكثر كمثال وأنا أنصحك بدراسة الوثائق بتفصيل كبير وتكييفها مع العمليات المحددة الخاصة بك.

كود php كمثال للعمل مع api (يستخدم للأغراض التعليمية فقط)
<?php Class AtolWebDriver { protected $addr="127.0.0.1",$port="16732"; public $timeout = 30; //  public $operator; function __construct($addr=false,$port=false) { if ($addr!==false) $this->addr=$addr; if ($port!==false) $this->port=$port; } public function CallAPI($method, $data,$_url="/requests") { $url = "http://".$this->addr.":".$this->port.$_url; $curl = curl_init($url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl,CURLOPT_TIMEOUT, $this->timeout); $headers = ['Content-Type: application/json']; curl_setopt($curl,CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); $resp = curl_exec($curl); $data = json_decode($resp,1); $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); $res= [$data,$code,$resp]; print_r($res); return $res; } //   public function get_res($uuid) { $ready = false; $cnt=0; $res_url = '/requests/'.$uuid; while (!$ready && ++$cnt<60) { usleep(500000); // ,     list($res,$code,$resp) = $this->CallAPI('GET',[],$res_url); $ready = ($res['results'][0]['status'] == 'ready'); if ($ready) return $res; } return false; //    } //  public function add_req($uuid,$req) { return $this->CallAPI('POST', ['uuid'=>$uuid,'request'=>$req]); } //  id   public function gen_uuid() { return exec('uuidgen -r'); } //      public function atol_task($type,$req=[]) { $req['type'] = $type; $uuid = $this->gen_uuid(); $req = $this->add_req($uuid,$req); if ($req[1]!='201') return false; //  $res = $this->get_res($uuid); //  if ($res===false || !isset($res['results'][0])) return false; return $res['results'][0]; } /*    */ //  public function get_shift_status() { $res = $this->atol_task('getShiftStatus'); if ($res===false) return false; //closed / opened / expired return $res['result']['shiftStatus']['state']; } //  public function open_shift() { $status = $this->get_shift_status(); //e ,    if ($status=="expired") $this->close_shift(); if ($status=="opened") return "    "; $res = $this->atol_task('openShift',['operator'=>$this->operator]); } //  public function close_shift() { $status = $this->get_shift_status(); if ($status=="closed") return "    "; $res = $this->atol_task('closeShift',['operator'=>$this->operator]); } public function items_prepare($items) { $res_items = []; $summ = 0; while ($item = array_shift($items)) { $res_item = $item; if (!isset($item['type'])) $res_item['type']="position"; if (isset($item['price']) && isset($item['quantity'])) { $res_item['amount'] = $item['price']*$item['quantity']; $res_item['tax'] = ['type'=>'none']; $summ+=$res_item['amount']; } $res_items[] = $res_item; } return [$res_items,$summ]; } // sell,  sellReturn public function fiskal($type_op="sell",$items,$pay_type="cash") { $data = []; $data['operator'] = $this->operator; $data['payments'] = []; list($data['items'],$summ) = $this->items_prepare($items); //+++       $data['payments'][] = ['type'=>$pay_type,'sum'=>$summ]; $res = $this->atol_task($type_op,$data); } } //  ip   web-  ,      $atol = new AtolWebDriver('192.168.100.10'); //    $atol->operator = ['name'=>'.']; //       $items = []; $items[] = ['name'=>' ','price'=>0.7,'quantity'=>1]; $items[] = ['name'=>' ','price'=>0.4,'quantity'=>1]; //  $atol->open_shift(); //  $atol->fiskal("sell",$items); sleep(10); // ,     //     , ..    $atol->fiskal("sellReturn",$items); //     sleep(20); // ,   $atol->close_shift(); 


هناك بعض العيوب التي سأصلحها هنا

  1. تقريب الكسور عند حساب المبالغ ، تحتاج إلى التقريب إلى سنتات ، وإلا يمكنك الحصول على 1.000000001 أو 0.999999999
  2. مع الإملاء الصحيح لبقية منطق البرنامج ، لا يحدث هذا عادةً ، لكن خلال الاختبارات ، أدركت حقيقة أن المهمة أرجعت نتيجة خطأ ، وكنت أنتظر الاستعداد

حسنًا ، أثناء عملية التنفيذ ، أخشى أن ألحق الكثير من الأخطاء ، على سبيل المثال ، إذا كانت المهمة معلقة لفترة طويلة في حالة الانتظار ، فمن الأفضل إزالتها من قائمة الانتظار ، وإلا فإن المهام اللاحقة ستتوقف لعدة دقائق ، لقد اشتعلت خللًا مرة واحدة ، ولم أكن آمل أن تطبع وهنا أجلس ، لكنه قفز وطبعت على الفور اثنين من الشيكات في صف واحد أرسلت في وقت سابق ...

بشكل عام ، من الممكن جمع عمليات الاستحواذ من الموقع في المستقبل ، إذا لم يكن لديهم شيكات عبر الإنترنت ، حتى تقرر أي شيء يمكن الاستحواذ عليه. لكن الحل ، على الأرجح ، كالفكرة عن حل ما ، سيوضح الوقت كيف سيتجذر هذا الصندوق.

تحذير ، بالنسبة لأولئك الذين قرأوا المقال عن غير قصد وليسوا مؤهلين جدًا في مسألة الأمان - خدمة الويب هذه لا تحتوي على تشفير (https) ، لا تحصل على إذن ، حتى لو تم استخدامه فقط على الشبكة المحلية - قم بتكوين الحماية للوصول إلى المنفذ.

Source: https://habr.com/ru/post/ar457684/


All Articles