Monday, June 16, 2014

Минусы Shopotam (ebaytoday)

Просторы интернета пестрят восторженными отзывами о посреднических сервисах. Можно разделить эти отзывы на:

  • Инструкции по покупке в зарубежных интернет магазинах
  • Описание мегапокупки совершенной при помощи сервиса
  • Инструкции по максимизации выгоды и минимизации издержек.

Все эти статьи либо появляются откровенно на правах рекламы, либо не так откровенно, но мотивация у авторов есть. Посреднические сервисы используют скидки на свои услуги для продвижения, нередки компании "приведи друга, получи 0,5%" или "напиши отзыв, получи 5$ на счет". Эти механизмы продвижения эффективны, прибавим заказные статьи и контекстную рекламу и.. Я бы использовал те же способы на их месте. Молодцы ребята. С другой стороны бюджет на использование всех механизмов сразу должен быть весьма приличным, а это наводит на мысли о маржинальности услуг. Раз столько написано про плюсы, напишу пожалуй про минусы.
Мне приходится время от времени заказывать оборудование в США или в Китае. Рынок в штатах переполнен бу оборудованием по сходным ценам и его легко купить (cisco, hp, fluke...), а Китай предоставляет возможность экономии на каких то мелочах (батарейки, arduino, запчасти). В РФ бу оборудования, кстати, тоже навалом стало, просто оно продается под прилавком, мешает информационная закрытость. И если его выкупят у гос конторы за 500 руб, то на Avito оно появится с плохим описанием и уже за 5000.  В процессе часто приходится пользоваться посредником Shopotam. 
Я ленивый - это основная причина по которой я до сих пор не перешел к shipito или полярному экспрессу. Регистрация в новом сервисе занимает какое то время, нахождение нужных кнопочек в интерфейсе. У сервиса есть плюсы, но никто не пишет про минусы, а они есть (объективные и субъективные). Например:
  1. Умалчивание
  2. Скорость работы
  3. Гарантии
  4. Тех поддержка

Умалчивание. 

Зайдя на сайт можно онлайн калькулятором просчитать стоимость покупки или доставки. 3 бакса за мэйл форвард, 10% комиссия при покупке, на первый взгляд всё прозрачно. Можно сравнить эти цены с конкурентами, сделать выводы о ценовой привлекательности сервиса. Только на самом деле ценник на все услуги можно смело умножать на 110%. Дело в том что для оплаты вы не можете просто использовать paypal или visa, mastercard. Вам придется либо заплатить платежной системе нехилую комиссию, либо оплатить в рублях по курсу устанавливаемому сервисом Shopotam, иногда одно другому не мешает. На момент написания статьи:
34,32  ЦБ РФ
36,18  Shopotam через РБК
Операции ввода/вывода средств в кошелёк посредника очень дороги. Может и есть способ экономии, например, мне встречались хвалебные отзывы об оплате Webmoney WMZ. То есть нужно купить долларов в банке, потом купить WMZ у кого то. Но мне не удалось найти в своем городе WMZ обменника, и думаю что вход/выход в Webmoney + перевод в shopotam будет стоить сравнимо с другими вариантами, а возни больше. 
Уверен что комиссии должны быть прозрачными, сейчас сервис делает всё возможное чтобы не информировать пользователей о реальных расценках на услуги. Наученный горьким опытом я теперь раз 5 прикину стоит ли овчинка выделки.
Здесь стоит сделать небольшую ремарку. Необходимость использования сервиса возникает в том случае если продавец принципиально не отсылает в РФ или если он отправляет посылки дорогой курьерской службой (для США UPS например). При этом возникают расходы на отправку до склада посредника, а потом еще и со склада до покупателя. То есть делая ставку в лоте на 30 баксов нужно понимать что доставка может обойтись в 100 баксов. Стоит перед размещением ставки потратить 5 минут и спросить продавца о возможности отправки в РФ (отправки дешевой почтой). Можно даже предложить ему немного накинуть сверху за "риски". Вероятность отказа тем ниже чем выше ваша репутация. Чтобы не терроризировать продавца можно о доставке спросить и после выигрыша лота, только не отказывайтесь от лота в случае если продавец упрямый. Лучше делая ставку рассчитывать на худший вариант.
Я не говорю про покупки силами самого посредника, там вообще здравый смысл отсутствует. При ценах ниже на 20% оплатить комиссию за ввод денежных средств, плюс за посредничество, плюс доставку, плюс риски связанные с доставкой и самим товаром - к чёрту такие спец предложения.
О - еще добью, мне после совершения очередной операции посредник выводит мега спец предложение с переходом на другой тариф. Круто думаю, занеся курсор на "согласен", читаю в чем же предложение... В ухудшении ценовых условий :) При определенных условиях может и выгодно, но это в очень редких случаях.

Скорость работы.

Продавец отправляет мне посылку. Есть трекинг номер почтового отправления, я заношу в сервис посредника информацию "Ждите посылку с таким то номером, едет" . Посылка пришла по данным трекинга еще 5 дней назад на склад Shoptam. Это же не должно быть так сложно - при получении посылки сразу отсканировать штрих коды, считать номер трекинга, отправить мне уведомление о получении посылки! Это должно занимать несколько минут, ну часов, но не 5 дней. В общем случае проходит дня 2. Потрясающая скорость работы. Так этого мало, потом еще дня 2 будут упаковывать и отправлять. Сама доставка от сервиса Shopotam тоже может затянуться. Это только на сайте всё так красиво, в реальности почта РФ сейчас может работать быстрее. Хотя может это только мне так не везло с доставкой силами посредника.
Предположим что покупка произведена в США. Доставка по стране в среднем 3 дня, плюс 2 дня ожидания на складе посредника пока её найдут, плюс 2 дня упаковки и отправки, плюс 5 дней (как обещают в сервисе) доставка экспрессом. (почта РФ может за 10 дней доставлять если захочет).
Итого из 12 дней целых 4 дня посылка что то делает у посредника на складе. Есть о чем задуматься логисту сервиса.
Разумеется любые праздники в любой из стран (отправки/получения) встречаются работниками сервиса на ура. 
Ремарка. Меня всегда особо радуют этим наши курьерские службы (автотрейдинг, пэк, деловые линии): 
"У нас уже закончился рабочий день, а завтра выходные. Приходите в понедельник", а ведь вот она, лежит моя посылка в паре метров.
С учетом того что сервис не из дешевых хочется сервиса соответствующего.

Гарантии.

Ну тут я придираюсь конечно. В одном случае я попал на пару сотен баксов. При заказе товаров на склад посредника Amazon упорно не принимал адрес склада. Постоянно просил переделать его и говорил что такого адреса не может быть. Ну не может так не может сказал я и разрешил Амазону исправить почтовый индекс. Время идет, посылки не появляются на складе посредника. Обращение в тех поддержку, переписка, уточнения заняли пол месяца. Выяснилось что кто то получил мои посылки, но это не Shopotam. 
Каким образом посылки смог получить кто то с неправильным индексом, но по правильному адресу?
Каким образом Shopotam смог найти в UK такой адрес которого не знает Amazon? Почему не попытались объяснить тех поддержке Amazon что такие индексы бывают?
Сколько еще таких посылок ушло соседям склада?
Посредник разумеется не виноват, умыл руки и отошел в сторону. В общем сам виноват, но ответственности у посредника никакой.
По поводу страховки предлагаемой сервисом - 2% предлагаемые по умолчанию это тоже очень  приличная страховая премия. Мы же уже заплатили 10% от транспортировки при конвертации, теперь еще 2.2% от стоимости товара. При чем непонятно - за что? 
Если приедет товар ненадлежащего качества посредник всегда сошлётся на продавца. Для разборок с продавцом часто требуется отправка товара обратно, а это часто дороже самого товара.. Если продавец отправил вам в руки - он и оплатит расходы по доставке обратно, в случае с mailforward отправка обратно на склад посредника за ваш счет.
Если товар повредился в пути или вообще не дошел (затонул контейнер, в аэропорту выпал) то разве транспортная компания не должна возместить стоимость? С почты РФ получить сложно, но с Шопотам экспресс то должно быть все хорошо, клиенто-ориентированность и т.п. - разве нет?

Тех поддержка.

Сервис судя по расходам на рекламу имеет неплохую маржинальность. Но вот поддержка хромает. В принципе, отвечают. Но вопросы нужно формировать Крайне четко, вносить в вопрос всю возможную информацию. Мы ведь живем в каменном веке и сотрудники поддержки не могут сами посмотреть подробную информацию по посылкам и товарам касающимся конкретного пользователя. Нестандартный вопрос, да еще и требующий ответа со склада? Ответ займет пару дней. Склад как будто упрашивать надо ответить.
Задерживается отправка или доставка? В любом человеческом сервисе вам напишут, чтобы не волновались (сдвигаем сроки по такой то причине, пардон, примите дисконт в подарок), но не здесь. Здесь нужно напрячь тех поддержку.
Вообще я понимаю что тех поддержка обходится дорого, и нужно на ней экономить, но уверен что большая часть вопросов связана с неизвестностью. Пользователь просто не в курсе что и где происходит с его заказом. Информируйте его в автоматическом режиме и он не будет тревожить поддержку.

Пусть этот пост здесь полежит пока.

Monday, April 28, 2014

Домашний климат под контролем 2 (Arduino + CO2)

Just another meteostation, co2meter

Получив в руки игрушку под названием Arduino первое что приходит в голову - поморгать светодиодами, второе - собрать метеостанцию.
Следующим после уровня влажности  и температуры меня интересовал уровень загрязнения воздуха. А самое главное - уровень CO2. Этот показатель основа для определения качества воздуха. Если этот показатель в норме, то и с остальными газами скорее всего нет проблем. Это показатель проветриваемости помещения. Основной источник CO2 в помещении это мы сами. Минимальный уровень CO2 это обычно свежий уличный воздух - 300-400 ppm. Уровень приемлемый в жилом помещении 500-800 ppm.  Высокий уровень CO2 вызывает головные боли, тошноту, слабость, в общем симптомы отравления вплоть до несовместимости с жизнью.
Сенсоров CO2 дешевых не встречал. Китайцы не захламили ebay вариантами "все по 10 долларов", так что искать нужно у приличных производителей. При выборе смотреть нужно на уровень определения газа, для наших бытовых случаев достаточно будет от 0-400 ppm до 2000-10000 ppm. Ниже 400 у нас не будет показаний, а выше 2000 это уже очень серьезный повод покинуть помещение. Из всего что просмотрел мне приглянулся K30 от co2meter.com. Есть скетчи для arduino, есть различные варианты подключения (аналог, UART, I2C), есть система автокалибровки и все это за 65 баксов без учета доставки. Правда в РФ по сложившейся традиции не доставляют, так что ищем посредников.

По моему опыту от девайса требуется:

  • возможность посмотреть данные мониторинга на самом девайсе (глупо идти за смартфоном чтобы узнать влажность в комнате когда датчик на расстоянии вытянцтой руки). Экран в таких устройствах очень желателен.
  • возможность смотреть данные (графики) онлайн. Скидываем куда нибудь вроде narodmon.ru .
  • возможность изменять настройки устройства через веб интерфейс (к сожалению на маломощных UNO и Ethernet с 32kb FLASH и 2 SVRAM веб интерфейс это из мира фантастики).
Приведенная здесь простенькая инструкция по сборке DIY устройства мониторинга качества воздуха в помещении может вам помочь в оздоровлении окружающей вас среды.

Элементы:

Arduino (Uno + Ethernet shield, Ethernet, Ethernet with PoE)
DHT22 (dht11, AM2302)
K30
LCD 1602 (LCM1602 IIC V2)

Схема подключения:

co2 k30 pinout

LCD для экономии задействованных контактов был выбран с нашлепкой в виде PCF8574T, а сенсор AM2302 уже шел в DHT22 с резистором. Рекомендую почитать таки datasheet от K30.

Скетч для ардуино:



/*

Library LCD.
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
1602 with PCF8574T  LCM1602 IIC V1


K_Series.h -Library for interfacing with a K-series sensor
Created by Jason Berger
for CO2METER.com
OCT-12-2012
http://www.co2meters.com/Documentation/AppNotes/AN126-K3x-sensor-arduino-uart.zip

FILE: dht.h
VERSION: 0.1.05
PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
URL: http://playground.arduino.cc/Main/DHTLib
HISTORY:
see dht.cpp file


MemoryFree library based on code posted here:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1213583720/15
Extended by Matthew Murdoch to include walking of the free list.

 */



#include <SPI.h>
#include <Ethernet.h>
#include "kSeries.h"
#include <dht.h>
#include <MemoryFree.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

dht DHT;
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);



EthernetClient client; //

char CurTemp[5]={
}
,CurHum[5]={
}
,ppm[5]={
};

kSeries K_30(6,8);

// CHANGE MAC ADDRESS TO ANY OTHER!!! (use http://www.miniwebtool.com/mac-address-generator/ for example)
byte mac[] = {
  0x90, 0xA2, 0x7C, 0x5E, 0xA7, 0xB9       }; // default mac address of ethernet shield

boolean DHCP = true,NMService=true,DHT22=true,DL=false,K30=true;

IPAddress IP=(192,168,1,121),GW=(192,168,1,1),DNS=(192,168,1,1),NMIP=(94,19,113,221);
IPAddress server(94,19,113,221);
int DHT_P=(7),DL_P=int (5);


const unsigned long postingInterval = 400000;  // интервал между отправками данных в миллисекундах (5 минут)
unsigned long lastConnectionTime = postingInterval;           // время последней передачи данных
boolean lastConnected = false;                  // состояние подключения
int HighByte, LowByte, TReading, SignBit, Tc_100;
char replyBuffer[106],macch[14];


void setup() {
  delay(200);
  Serial.begin (115200);
  if (DHCP) {
    if (Ethernet.begin(mac) == 0) {
      Serial.println("Failed  DHCP");
      // doing nothing
      for(;;)
        ;
    }
  }
  else {
    Ethernet.begin(mac, IP);

  };
  delay(500);  // Couple of seconds just to warm up Ethernet.
  Serial.println();
  Serial.print("IP ");
  Serial.println(Ethernet.localIP());
  genmacchar();

  lcd.backlight ();

  lcd.begin(16,2);               // initialize the lcd

  lcd.home ();                   // go home
  lcd.print ("IP ");
  lcd.print(Ethernet.localIP());
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print ("MAC ");    
  lcd.print (macch);

  Serial.println();
  Serial.print("IP Address is ");
  Serial.println(Ethernet.localIP());


  Serial.print ("MAC ");
  Serial.println (macch);
  delay (2500);
  lcd.clear ();
  lcd.home ();
  lcd.print ("   ");
  lcd.print((char)223);
  lcd.print ("C");
  lcd.setCursor ( 0, 1 );
  lcd.print ("   ");

  lcd.print ("%     ppm");




}

void loop() {
  delay (500);

  lcd.home ();
  if (DHT22) DHTRead();
  if (K30)  co2();

  delay (3000);
  Serial.print("frmem()=");
  Serial.println(freeMemory());
  //debug
  if (client.connected()) Serial.println ("client connected");


  Serial.println ("client stopped");

  Serial.print ("lastConnectionTime= ");
  Serial.println (lastConnectionTime);
  Serial.print ("postingInterval= ");
  Serial.println (postingInterval);
  Serial.print ("millis= ");
  Serial.println (millis());
  Serial.print ("CurTemp=");
  Serial.println (CurTemp);
  Serial.print ("CurHum=");
  Serial.println (CurHum);
  Serial.print("frmem()=");
  Serial.println(freeMemory());

  //debug
  if (client.connected() && lastConnected) {
    client.stop();
  }
  if(!client.connected() && ((millis() - lastConnectionTime )> postingInterval))   {
    formingPOST ();

  }
  lastConnected = client.connected();

  delay (1000);



}



void co2 (){ //reading data from CO2 sensor
  itoa (K_30.getCO2('p'),ppm,10);
  //Print the value on Serial
  Serial.print("Co2 =");
  Serial.println(ppm);
  lcd.setCursor (9,0);
  lcd.print ("     ");
  lcd.setCursor (9,0);
  lcd.print (ppm);

}


void formingPOST (){

  Serial.println ("forming POST");

  //формирование HTTP-запроса. Preparing http request.
  memset(replyBuffer, 0, sizeof(replyBuffer));
  strcpy(replyBuffer,"ID=");
  strcat(replyBuffer,macch);
  //Конвертируем MAC-адрес. Converting mac address.

  //конвертируем адрес термодатчика. Converting first sensor address.
  Serial.print ("Here is our replyBuffer");
  Serial.println (replyBuffer);
  strcat(replyBuffer,"&");
  strcat(replyBuffer,macch);
  strcat(replyBuffer,"01");
  Serial.print ("Here is our replyBuffer");
  Serial.println (replyBuffer);
  //конвертируем адрес датчика влажности. Converting secong sensor address.
  strcat(replyBuffer,"=");
  if (SignBit)
  {
    strcat(replyBuffer,"-");
    Serial.println (" Beware of Minus !!! ");
  }

  strcat(replyBuffer,CurTemp);
  strcat(replyBuffer,"&");
  strcat(replyBuffer,macch);
  strcat(replyBuffer,"02");
  strcat(replyBuffer,"=");
  strcat(replyBuffer,CurHum);
  strcat(replyBuffer,"&");
  strcat(replyBuffer,macch);
  strcat(replyBuffer,"03");
  strcat(replyBuffer,"=");
  Serial.print ("Here is our ppm");
  Serial.println (ppm);
  strcat(replyBuffer,ppm);
  Serial.print ("Here is our replyBuffer");
  Serial.println (replyBuffer);
  httpRequest();



}

void httpRequest() {
  Serial.print ("staring to POST request");

  if (client.connect(server, 80)) {

    // send the HTTP POST request:
    client.println("POST http://narodmon.ru/post.php HTTP/1.0");
    Serial.println("POST http://narodmon.ru/post.php HTTP/1.0");
    client.println("Host: narodmon.ru");
    Serial.println("Host: narodmon.ru");
    //client.println("User-Agent: arduino-ethernet");
    //client.println("Connection: close");
    client.println("Content-Type: application/x-www-form-urlencoded");
    Serial.println("Content-Type: application/x-www-form-urlencoded");
    client.print("Content-Length: ");
    client.println(strlen(replyBuffer));
    Serial.print("Content-Length: ");
    Serial.println(strlen(replyBuffer));
    client.println();
    Serial.println();
    client.println(replyBuffer);
    Serial.println(replyBuffer);
    client.println();

    delay(1000);
  }
  else {
    Serial.print("http request failed - client not connected");
    client.stop();
  }
  lastConnectionTime = millis();
}

void DHTRead (){

  int chk = DHT.read22(DHT_P);
  Serial.print(chk);
  switch (chk)
  {
  case DHTLIB_OK:
    Serial.println("DHT OK,\t");
    delay (1000);
    dtostrf(DHT.temperature, 3, 0, CurTemp);
    Serial.print("temp and hum");
    Serial.print (CurTemp);

    Serial.print(",\t");
    delay (1000);
    dtostrf(DHT.humidity, 3, 0, CurHum);
    Serial.println (CurHum);
    lcd.setCursor(0,0);
    lcd.print ("   ");
    lcd.setCursor (0,1);
    lcd.print ("   ");
    lcd.setCursor(0,0);
    lcd.print (CurTemp);
    lcd.setCursor (0,1);
    lcd.print (CurHum);

    break;
  case DHTLIB_ERROR_CHECKSUM:
    Serial.print("Checksum er,\t");
    break;
  case DHTLIB_ERROR_TIMEOUT:
    Serial.print("Time out er,\t");
    break;
  default:
    Serial.print("Unknown er,\t");
    break;

  }


}

void genmacchar() {
  for (int k=0; k<6; k++)
  {
    int b1=mac[k]/16;
    int b2=mac[k]%16;
    char c1[2],c2[2];

    if (b1>9) c1[0]=(char)(b1-10)+'A';
    else c1[0] = (char)(b1) + '0';
    if (b2>9) c2[0]=(char)(b2-10)+'A';
    else c2[0] = (char)(b2) + '0';

    c1[1]='\0';
    c2[1]='\0';

    strcat(macch,c1);
    strcat(macch,c2);
  }
}



Выглядит непрезентабельно, комментариев мало, если будет возможность - переделаю.
ОБЯЗАТЕЛЬНО меняем mac адрес в скетче на свой или на генерируемый.

Вставляем все в корпус и запускаем. Приятной сборки.





Saturday, January 11, 2014

Anviz fingerprint + SQL

Попались в руки замечательные штуки от Anviz (С2, С3 fingerprint scanners).
Если кто не понял - ставим сканеры отпечатков пальцев на входе в офис и получаем контроль доступа в офис и контроль посещаемости рабочих мест (отслеживание опозданий, неявок, ранних уходов). Пришел сотрудник, приложил палец (любой) и автоматически в журнале отметился приход на работу, при необходимости еще и дверь/турникет открылись. Если кто то не хочет сканировать свои драгоценные пальчики - можно использовать RFID карты. На ПК можно построить отчетность по посещаемости в различных разрезах.
Чем же эти сканеры отпечатков пальцев замечательны:
  • Привлекательная цена. Контроллеры Anviz начального уровня в сборе стоят в России от 10 до 20 т.р, что уже вполне могут себе позволить пользователи малого бизнеса.
  • Простота установки. Наличие статуса "опытный пользователь" позволит произвести все процессы необходимые для запуска.

  Из минусов:
  • сложности с поддержкой (продавцы в РФ после продажи вообще на письма не реагируют, софт идущий в комплекте неработоспособен, сайт поддержки anviz.com подглючивает)
  • недостаток информации об устройстве, компонентах, интеграции. Этот минус мы здесь и пытаемся переправить на плюс.
  • глючность устройства (может перестать отвечать на запросы извне, решается перезагрузкой, в настройках устройства есть возможность установки перезагрузки по расписанию)
  • глючность софта. (кстати прошивок новых давно не выпускали).
  • не у всех людей отпечатки легко распознаются устройством. У меня статистика один к двадцати. Решается выдачей таким уникумам карточек RFID.
  • Нет поддержки PoE.
Ну и в общем очень прикольная штука, сразу несколько друзей и знакомых решили себе поставить такие в офисы. Есть еще сканеры с распознаванием лица, но пока и пальцев хватает. Со вступлением закончили.

Итак софт от Anviz (Intelligent management system, она же AIM Standard, она же имеет несколько отечественных названий) по умолчанию работает с базой данных MS Access. База располагается где то в папках вроде C:\Anviz\standard\Att2003.mdb Уточнить можно в меню "система" -> "связь с базой данных".


И все бы хорошо, но если нам необходимо построить какие либо отчеты кроме тех что стандартно зашиты в софт, нам придется обращаться к БД. Один 1С-ник сделал для себя обработку подключающуюся к БД Access и вытаскивающую нужные ему отчеты, сложного вроде ничего нет. Но во многих случаях при обращении к этой базе мы сталкиваемся с кофликтом. База данных постоянно должна быть открыта в Intelligent management system, чтобы скидывать туда данные по расписанию с наших контроллеров. А значит при обращении к базе из стороннего ПО мы можем получить ошибку монопольного доступа. Разбираться с расшариванием самой БД access я не стал, просто решил завести базу в MS SQL, благо опция есть в Intelligent management system. Для этого нам потребуется уже установленный MS SQL server, SQL Management Studio, Anviz Intelligent management system.



  • Открываем SQL Management Studio
  • Создаем в ней базу данных для наших нужд (например anviz)
  • находим в папке с установленным Intelligent management system файлик Att2003.sql. Обычно C:\Anviz\standard\Att2003.sql.
  • Открываем этот файл в SQL Management Studio
  • Указываем для какой базы выполнить набор команд (мы ведь создали её перед этим шагом) и запускаем. 
  • Проверяем базу данных, она уже должна содержать все таблицы для работы с Intelligent management system.


  • Запускаем Intelligent management system, указываем в пункте "система" -> "связь с базой данных" поставщика данных Microsoft OLE DB Provider for SQL Server. Название может отличаться в разных версиях, но суть одна.
  • В следующем окне выбираем SQL сервер из списка, или вводим руками один из своих sql серверов (тот на котором мы создали нашу базу данных). И выбираем базу данных на сервере. Проверяем соединение.
  • На всякий случай перегружаем Intelligent management system.

Готово, программа работает с SQL. Кстати - делать такой перевод нужно до того как настроите программу и контроллер. Иначе есть вероятность что придется настраивать всё заново, включая сбор отпечатков пальцев со всех сотрудников.  В моем случае я просто загрузил всех пользователей из устройства, но это привело к каким то пока не понятным глюкам с редактированием пользователей.

Теперь можем строить отчеты из бд MS SQL, например в странички Sharepoint выводить состояние посещаемости (перечень отсутствующих, регулярно опаздывающих, каждому сотруднику его табель на страничку).