Обслужване на една опашка

Масово се говори за предлагане на „Услуги на едно гише“ – такива предлагат в офисите на НАП, в КАТ, в общините, в банките и къде ли още не. Както и всичко останало (тук щях да кажа в България, но вероятно не е изолиран случай), нещата са криво разбрани. Концепцията за обслужване на едно гише е, когато отидеш в мястото за обслужване, независимо от това, което трябва да свършиш, да можеш да го свършиш на всяко от наличните гишета, в това число, ако имаш да правиш повече от едно нещо – да свършиш всички задачи на едно място.

Елементарният пример е, ако пазаруваш в супермаркета – като стигнеш до услугата „ПЛАЩАНЕ“ – няма значение на коя от касите ще се наредиш. Можеш да платиш на всяка от касите. Нещо повече – ако си купил месо, млечни продукти, плодове, зеленчуци и напитки – не е нужно да се наредиш на пет различни каси, за да платиш всеки от продуктите на различна каса. Нареждаш се на една опашка и плащаш всички продукти – на едно гише!

Какво обаче се случва с обслужването на едно гише в България? Примерно офис на НАП или някоя банка – влизаш и във фоайето те посреща някакъв киоск (ако имаш късмет работи) и в най-добрия случай на екрана има опция за това, което искаш да свършиш. В действителност в голяма част от случаите се получава, че някои от услугите са групирани и са описани по начин, който е абсолютно непонятен за потребителя. Например „Услуги по чл. 168, ал. 2 от ЗМНФВ“… зад такова заглавие може да се крие подаване на 40 вида декларации, обаче ти трябва да знаеш този факт, за да си свършиш работа.

И така – допускаме, че киоскът работи, потребителят знае какво ще прави, в това число знае „научното“ му название, натиска бутончето, хартията в машината не е свършила, машината печата листче с номер и ти казва – вие сте №Х, преди вас чакат Y човека, следете на таблото кога ще изтеглят вашия номер.

И започва томболата – аз съм примерно №280, в момента са стигнали до 275, аз съм силно обнадежден, че след само пет номера съм на ред… и изведнъж следващия изтеглен номер е 286, следва 281, след това 290 и т.н… а аз си вися примерно половин час… и чакам да дойде моят ред.

Защо? Защото в действителност системата не е „обслужване на едно гише“, а „обсужване на една опашка“. Единственото общо между чакащите е номерацията на хората на опашката. Защото в зависимост от направения избор при тегленето на номер системата те насочва на различно гише. В действителност потребителите не се обслужват на едно гише, нито на което и да е гише. Нещо повече, ако планирам да използвам две или три услуги (не дай си боже – различни), трябва да изтегля три отделни номера, защото всяка от услугите се предоставя на различно място. Съответно – ако една от опашките се движи по-бързо, а друга по-бавно – ще трябва да си чакаш. А ако си особено късметлия – номерът ще дойде на ред по едно и също време за две различни гишета.

Та хората проектиращи такива системи, трябва да ги карат, когато пазаруват в супермаркета, да плащат на няколко различни каси, като на всяка изчакват опашката наново, за да им влезе в главите, какво е „обслужване на едно гише“, а ако не им влезе в главите, да им се забрани да се занимават с неща, които не им влизат в кратуните.



Функции за ЕГН в MySQL

Естествено, че в MySQL няма вградени функции за работа с ЕГН-та, но това не пречи да си ги дефинираме сами. След като преди време търсих такива за Excel и всичко, което намерих – чеп за зеле не ставаше, написах си мои. Сега търсих функции за ЕГН и ЛНЧ в MySQL и естествено – не намерих. Затова на бързо си сътворих няколко и ги шервам тук.

Няма да навлизам в тежък обяснителен режим кое, как и защо. Първата функция е check_egn и проверява дали контролната сума на подадения ЕГН е валидна. НЕ валидира, дали датата вътре е „възможна“, а само дали контролната сума е валидна. Връща 1, ако е валидна или 0, ако не е валидна. Ако имаме таблица с колона `egn` може да извадим само записите с невалидните ЕГН-та със следната заявка: SELECT * FROM `table_name` WHERE egn_check(`egn`) = 0; ерго, ако трябват само валидните в условието може да се посочи единица. Ако ЕГН-то не е 10 символа – автоматично връща 0.

DELIMITER $$
CREATE FUNCTION `check_egn`(`egn` VARCHAR(10)) RETURNS tinyint(3) UNSIGNED
NO SQL
DETERMINISTIC
BEGIN
DECLARE s1_sum, i, c, w INT DEFAULT 0;
DECLARE weights VARCHAR(9) DEFAULT ‘248509736′;

IF CHAR_LENGTH(egn) <> 10 THEN
RETURN 0;
END IF;

label1: LOOP
SET i = i + 1;
IF i < 10 THEN
SET c = CAST(SUBSTRING(egn, i, 1) AS UNSIGNED);
SET w = CAST(SUBSTRING(weights, i, 1) AS UNSIGNED);
IF w = 0 THEN
SET w = 10;
END IF;
SET s1_sum = s1_sum + (c * w);
ITERATE label1;
END IF;
LEAVE label1;
END LOOP label1;
SET s1_sum = (s1_sum % 11) %10;

IF s1_sum = CAST(SUBSTRING(egn, 10, 1) AS UNSIGNED) THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END$$
DELIMITER ;

Втората функция е почти същата, като първата, но проверява за контролната сума на ЛНЧ (която неизвестно защо е с различни тегла и делител от ЕГН). Извиква се по същия начин, както и предишната функция, връща същите резултати, само името на функцията е check_lnc().

DELIMITER $$
CREATE FUNCTION `check_lnc`(`lnc` VARCHAR(10)) RETURNS tinyint(3) unsigned
NO SQL
DETERMINISTIC
BEGIN
DECLARE s1_sum, i, c, w INT DEFAULT 0;
DECLARE weights VARCHAR(18) DEFAULT ‘211917131109070301′;

IF CHAR_LENGTH(lnc) <> 10 THEN
RETURN 0;
END IF;

label1: LOOP
SET i = i + 1;
IF i < 10 THEN
SET c = CAST(SUBSTRING(lnc, i, 1) AS UNSIGNED);
SET w = CAST(SUBSTRING(weights, (i*2)-1, 2) AS UNSIGNED);
SET s1_sum = s1_sum + (c * w);
ITERATE label1;
END IF;
LEAVE label1;
END LOOP label1;
SET s1_sum = s1_sum %10;

IF s1_sum = CAST(SUBSTRING(lnc, 10, 1) AS UNSIGNED) THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END$$
DELIMITER ;

И накрая – третата функция връща датата на раждане от подаден ЕГН. Върнатата стойност е от тип DATE, т.е. във формат 0000-00-00. При евентуална необходимост може да бъде преформатирана в различен формат. Пример няма да посочвам – от първия би трябвало да става достатъчно ясно.

DELIMITER $$
CREATE FUNCTION `egn2date`(`egn` VARCHAR(10)) RETURNS date
NO SQL
DETERMINISTIC
BEGIN
DECLARE y, m, d INT DEFAULT 0;

IF CHAR_LENGTH(egn) <> 10 THEN
RETURN STR_TO_DATE(‘0000-00-00′, ‘%Y-%m-%d’);
END IF;

SET y = CAST(SUBSTRING(egn, 1, 2) AS UNSIGNED);
SET m = CAST(SUBSTRING(egn, 3, 2) AS UNSIGNED);
SET d = CAST(SUBSTRING(egn, 5, 2) AS UNSIGNED);

CASE
WHEN FLOOR(m / 20) = 1 THEN
SET y = y + 1800;
SET m = m – 20;
WHEN FLOOR(m / 20) = 2 THEN
SET y = y + 2000;
SET m = m – 40;
ELSE
SET y = y + 1900;
END CASE;

RETURN STR_TO_DATE(CONCAT(y,’-',LPAD(m,2,’00′),’-',LPAD(d,2,’00′)), ‘%Y-%m-%d’);

END$$
DELIMITER ;

Ползвайте със здраве, ако има някакви проблеми – пишете, да ги „ъпдейтна“… и успех с базите.

Мажоритарната система

Гледам, че Слави Трифонов се е изказал с тежката си компетентност по темата с мажоритарното гласуване и пак ми намирисва не много хубаво, понеже е обяснено, като всички факти са завъртяни така, че слънцето да ги огрява под подходящ ъгъл. А това след два дни ще подхлъзне маса народ да гласуват с да на глупавия му референдум.

Та какво твърди Слави трифонов, цитирам: “Ако имаме мажоритарен вот в два тура, при 6 милиона избиратели и 240 едномандатни избирателни райони, ще имаме приблизително по 25 хиляди гласа на район. За да стане депутат, който и да е, ще трябва да спечели 50 процента плюс един от тези 25 хиляди гласа. Как е в момента? Мартин Иванов-Данона – депутат от Пловдив област, благодарение само на 7 процента от гласовете!“.

Първото некоректно нещо в горното изказване е, че се прави заигравка с относителни стойности (проценти), с които масово хората си нямат представа как да работят, а процентите са едни други числа и не са като останалите. Та поради неразбирането, на обикновения човек, какво са относителните стойности, на повечето им звучи много логично – трябват 50%, а той има 7% и е избран. Но тук не се коментира въпросът от каква база са изчислени тези проценти, а в пропорционалните и мажоритарните избори базата е различна. Така че нека да разгледаме абсолютните стойностти – броят на получените гласове.

На последните парламентарни избори в България (през 2014 г.):

  1. Право да гласуват в Пловдив Област са имали 307146 (факт);
  2. Гласували са 151173 (също факт), което прави 49.21% активност на гласуване;
  3. Многомандатният избирателен райн Пловдив област избира 11 депутата, което означава че на всеки от тях се падат по 27922 избиратели (което не е много далече от числото на Слави, че при мажоритарна система с 6 милиона гласоподаватели и 240 депутата, за един средно ще гласуват около 25 хиляди избиратели. Реално числото няма да бъде точно, тъй като ще трябва малко да варира според гъстотата на населението в различните части на страната, така че можем да твърдим, че дотук сметката е приблизително коректна.
  4. Ако 49.21% от тези 27922 избирателя гласуват в мажоритарния вот, това ще прави около 13740 гласували. За да бъде избран за депутат в този едномандатен район, някой от кандидатите ще има нужда от половината + 1 от тези гласове, т.е. 6871 гласа те правят депутат.
  5. Мартин Иванов (чрез партията си) е получил 9814 гласа (факт), което означава, че потенциално би получил 71.42% от гласовете.

Разбира се, аз не съм Слави Трифонов и няма да спекулирам с този резултат – реално, кандидатът би получил много по-малък процент, защото това са гласове за партията, която го е издигнала, а не лично за него. Също така, тези гласове са събрани на по-голяма територия и при по-малък размер на избирателния район вероятно абсолютният брой гласове би бил по-малък. За съжаление не е възможно да преобразуваме на 100% резултата от пропорционалните избори, за да видим какво щеше да се случи ако бяха мажоритарни. Но оставям на вас да прецените, дали Мартин Иванов сега нямаше да е депутат, ако системата беше мажоритарна.

Защо драгият слушател остава измамен от обяснението на Слави Трифонов? На първо място, защото цитираните 7% са получени в многомандатен избирателен район, а не в едномандатен, както би било в една мажоритарна система. Или иначе казано – 11 кандидата са събрали по около 7% в този район, за да станат депутати, което е около 77% от гласовете и вече звучи доста по-легитимно от сравнението на 7% срещу 50%.

Втората мощна измама е, че в обяснението на Слави Трифонов, в контекста на пропорционалната система се гледат гласувалите, а в контекста на мажоритарната се гледат имащите право на глас. Знаейки, че избирателната активност е била малко под 50%, става ясно, че говорим за едно разминаване от два пъти, но както казах – добре е слънцето да огрява най-добре нашите аргументи.

Дали Мартин Иванов е най-големият проблем на пропорционалната избирателна система? В същите тези избори през 2014 г. средната цена на един мандат е била 12240 гласа. От избраните 240 депутати в 43то Народното събрание, 65 (почти една трета) са избрани с по-малко гласове от Мартин Иванов. Тук ще поставя риторичен въпрос: как Слави Трифонов избра именно това име за да онагледи предимството на предлаганата от него избирателна система и защо не избра някой друг от 65те, които имат по-лош резултат от Мартин Иванов и също са избрани.

Сега да видим недостатъците на мажоритарната система, защото Слави обяснява само за плюсовете ѝ, а ако е толкова интелигентен, колкото се опитва да се изкара, когато обяснява за нещо, задължително трябва да каже какви са неговите плюсове и минуси, ако изтъква само плюсовете си е жив популизъм, защото на всички би трябвало да е ясно, че освен плюсове трябва да има и някакви минуси. И така:

  1. Първи недостатък е, че при мажоритарната избирателна система, за избрания кандидат се гласува на много по-малка територия, тъй като едномандатният избирателен район е много по-малък. Сега да си представим т.нар. корпоративен вот или вот под заплаха от уволнение в слабо населен район на страната или просто да си представим купуване на гласове… дали е по-лесно управляемо на голяма територия или на малка? Особено говорейки за пропорции!

    Не само това – едномандатните избирателни райони ще се определят от управляващото мнозинство, което също ще им даде възможност да влияят на резултата чрез дребни нормативни промени. Разбира се, това и сега е възможно, но влиянието на този фактор при мажоритарните избори ще е много по-силно поради по-малкия размер на района.

  2. Вторият недостатък е, че при липсата на ясно изразена партийна система, към каквато се тласкаме чрез мажоритарния вот, създаването на единна политика на управляващото мнозинство е много по-слабо вероятно да се случи.

През последните 200 години много европейски държави са преминали от мажоритарни към пропорционални избирателни системи и почти няма такива, които да са преминали от пропорционална към мажоритарна, тъй като пропорционалните се смятат за по-съвършенни и модерни. Ако ще даваме примери къде мажоритарните системи работят, можем да дадем и примери къде мажоритарните системи не работят. На парламентарните избори в Канада през 1993 г. партията Progressive Conservatives получава 2 мандата срещу 16.1% от гласовете, партията Bloc Quebecois получава 54 мандата срещу 18.1% от гласовете, а партията New Democratic Party получава 9 мандата срещу 6.6% от гласовете.

И накрая само ще кажа, че аз не съм продавал мартеници, не съм пял, не съм правил концерти и не съм водил телевизионно предаване, от 13 години се занимавам с избори, а от 2 години пиша дисертация с тема за оптимизиране на системите за пропорционални избирателни системи. Имам научни публикации по темата и съм докторант в Българската академия на науките. Но ще оставя всеки сам да реши как и дали да гласува на референдума.

По-стари »