74 lines
3.2 KiB
PHP
74 lines
3.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace MonetaPhpShop\receipt;
|
|
|
|
use Closure;
|
|
|
|
/**
|
|
* Åäèíèöà èçìåðåíèÿ ïîçèöèè ÷åêà (`measure`, ïåðå÷åíü `kassaspecification.pdf`) ïî åäèíèöå òîâàðà
|
|
* PHPShop (`ed_izm` — ñâîáîäíûé òåêñò: «øò.», «êã», «ì2»). Âàðèàíòû íàïèñàíèÿ — òå, ÷òî êàññà
|
|
* ðàñïîçíà¸ò ñàìà («àâòîîïðåäåëåíèå» â ñïåöèôèêàöèè), ïëþñ òî÷êà íà êîíöå è ïðîáåëû, êàê ïèøóò
|
|
* â PHPShop. Íå ðàñïîçíàíî èëè ïóñòî — `unit` (øòóêà), çíà÷åíèå êàññû ïî óìîë÷àíèþ.
|
|
*
|
|
* Ñðàâíåíèå áåç ó÷¸òà ðåãèñòðà ÷åðåç `/iu`: `mbstring` ÿäðî PHPShop íå òðåáóåò. Âàðèàíòû — ëèòåðàëû
|
|
* ìîäóëÿ: ïîñëå ñáîðêè îíè â cp1251, à øàáëîí ñ `/u` îáÿçàí áûòü UTF-8, ïîýòîìó ïåðåä ñðàâíåíèåì èõ
|
|
* ïåðåêîäèðóåò òîò æå `$toUtf8`, ÷òî è ïðî÷èå ëèòåðàëû ÷åêà ({@see ReceiptBuilder}).
|
|
*/
|
|
final class Measure
|
|
{
|
|
public const UNIT = 'unit';
|
|
|
|
/** Êîä êàññû -> âàðèàíòû íàïèñàíèÿ (áåç ïðîáåëîâ, â íèæíåì ðåãèñòðå). */
|
|
private const VARIANTS = [
|
|
self::UNIT => ['øòóêà', 'øòóêè', 'øòóê', 'øò', 'pc', 'pce', 'pcs', 'nmb'],
|
|
'gram' => ['ãðàìì', 'ãðàììû', 'ã', 'ãð', 'g', 'grm'],
|
|
'kilogram' => ['êèëîãðàìì', 'êèëîãðàììû', 'êã', 'kg', 'kgm'],
|
|
'ton' => ['òîííà', 'òîííû', 'ò', 't', 'tne'],
|
|
'centimeter' => ['ñàíòèìåòð', 'ñì', 'cm', 'cmt'],
|
|
'decimeter' => ['äåöèìåòð', 'äì', 'dm', 'dmt'],
|
|
'meter' => ['ìåòð', 'ìåòðû', 'ì', 'm', 'mtr', 'ïì', 'ïîã.ì'],
|
|
'square_centimeter' => ['êâàäðàòíûéñàíòèìåòð', 'êâ.ñì', 'ñì2', 'cm2', 'cmk'],
|
|
'square_decimeter' => ['êâàäðàòíûéäåöèìåòð', 'êâ.äì', 'äì2', 'dm2', 'dmk'],
|
|
'square_meter' => ['êâàäðàòíûéìåòð', 'êâ.ì', 'ì2', 'm2', 'mtk'],
|
|
'milliliter' => ['ìèëëèëèòð', 'ìë', 'ml', 'mlt'],
|
|
'liter' => ['ëèòð', 'ëèòðû', 'ë', 'l', 'ltr'],
|
|
'cubic_meter' => ['êóáè÷åñêèéìåòð', 'êóá.ì', 'ì3', 'm3', 'mtq'],
|
|
'kilowatt_hour' => ['êèëîâàòò÷àñ', 'êâò*÷', 'êâò-÷', 'êâò÷', 'kwh'],
|
|
'gigacalorie' => ['ãèãàêàëîðèÿ', 'ãêàë', 'ãèãàêàë'],
|
|
'day' => ['ñóòêè', 'ñóò', 'äåíü', 'äí', 'd', 'day'],
|
|
'hour' => ['÷àñ', '÷', 'h', 'hur'],
|
|
'minute' => ['ìèíóòà', 'ìèí', 'min'],
|
|
'second' => ['ñåêóíäà', 'ñåê', 'ñ', 's', 'sec'],
|
|
'kilobyte' => ['êèëîáàéò', 'êáàéò', 'êá', 'kib', 'êèá', 'kb'],
|
|
'megabyte' => ['ìåãàáàéò', 'ìáàéò', 'ìá', 'mib', 'ìèá', 'mb'],
|
|
'gigabyte' => ['ãèãàáàéò', 'ãáàéò', 'ãá', 'gib', 'ãèá', 'gb'],
|
|
'terabyte' => ['òåðàáàéò', 'òáàéò', 'òá', 'tib', 'òèá', 'tb'],
|
|
];
|
|
|
|
private function __construct() {}
|
|
|
|
/**
|
|
* @param string $unit åäèíèöà òîâàðà â UTF-8
|
|
* @param Closure(string): string $toUtf8 ëèòåðàëû ìîäóëÿ -> UTF-8
|
|
*/
|
|
public static function fromUnit(string $unit, Closure $toUtf8): string
|
|
{
|
|
// Ïðîáåëû íå çíà÷èìû («êâ. ì»), òî÷êà íà êîíöå — ñîêðàùåíèå («øò.»).
|
|
$unit = rtrim((string) preg_replace('/\s+/u', '', $unit), '.');
|
|
if ($unit === '') {
|
|
return self::UNIT;
|
|
}
|
|
foreach (self::VARIANTS as $measure => $variants) {
|
|
foreach ($variants as $variant) {
|
|
if (preg_match('/\A' . preg_quote($toUtf8($variant), '/') . '\z/iu', $unit) === 1) {
|
|
return $measure;
|
|
}
|
|
}
|
|
}
|
|
|
|
return self::UNIT;
|
|
}
|
|
}
|