Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
CRAP | |
0.00% |
0 / 1 |
| PriceMapper | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
| findClientPrice | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| 1 | <?php |
| 2 | /** |
| 3 | * Jingga |
| 4 | * |
| 5 | * PHP Version 8.1 |
| 6 | * |
| 7 | * @package Modules\Billing\Models\Price |
| 8 | * @copyright Dennis Eichhorn |
| 9 | * @license OMS License 2.0 |
| 10 | * @version 1.0.0 |
| 11 | * @link https://jingga.app |
| 12 | */ |
| 13 | declare(strict_types=1); |
| 14 | |
| 15 | namespace Modules\Billing\Models\Price; |
| 16 | |
| 17 | use Modules\ClientManagement\Models\Attribute\ClientAttributeValueMapper; |
| 18 | use Modules\ClientManagement\Models\ClientMapper; |
| 19 | use Modules\ItemManagement\Models\Attribute\ItemAttributeValueMapper; |
| 20 | use Modules\ItemManagement\Models\ItemMapper; |
| 21 | use Modules\SupplierManagement\Models\SupplierMapper; |
| 22 | use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; |
| 23 | use phpOMS\Localization\Defaults\CountryMapper; |
| 24 | |
| 25 | /** |
| 26 | * Billing mapper class. |
| 27 | * |
| 28 | * @package Modules\Billing\Models\Price |
| 29 | * @license OMS License 2.0 |
| 30 | * @link https://jingga.app |
| 31 | * @since 1.0.0 |
| 32 | * |
| 33 | * @template T of Price |
| 34 | * @extends DataMapperFactory<T> |
| 35 | */ |
| 36 | final class PriceMapper extends DataMapperFactory |
| 37 | { |
| 38 | /** |
| 39 | * Columns. |
| 40 | * |
| 41 | * @var array<string, array{name:string, type:string, internal:string, autocomplete?:bool, readonly?:bool, writeonly?:bool, annotations?:array}> |
| 42 | * @since 1.0.0 |
| 43 | */ |
| 44 | public const COLUMNS = [ |
| 45 | 'billing_price_id' => ['name' => 'billing_price_id', 'type' => 'int', 'internal' => 'id'], |
| 46 | 'billing_price_name' => ['name' => 'billing_price_name', 'type' => 'string', 'internal' => 'name'], |
| 47 | 'billing_price_promocode' => ['name' => 'billing_price_promocode', 'type' => 'string', 'internal' => 'promocode'], |
| 48 | 'billing_price_item' => ['name' => 'billing_price_item', 'type' => 'int', 'internal' => 'item'], |
| 49 | 'billing_price_itemgroup' => ['name' => 'billing_price_itemgroup', 'type' => 'int', 'internal' => 'itemgroup'], |
| 50 | 'billing_price_itemsegment' => ['name' => 'billing_price_itemsegment', 'type' => 'int', 'internal' => 'itemsegment'], |
| 51 | 'billing_price_itemsection' => ['name' => 'billing_price_itemsection', 'type' => 'int', 'internal' => 'itemsection'], |
| 52 | 'billing_price_itemtype' => ['name' => 'billing_price_itemtype', 'type' => 'int', 'internal' => 'itemtype'], |
| 53 | 'billing_price_client' => ['name' => 'billing_price_client', 'type' => 'int', 'internal' => 'client'], |
| 54 | 'billing_price_clientgroup' => ['name' => 'billing_price_clientgroup', 'type' => 'int', 'internal' => 'clientgroup'], |
| 55 | 'billing_price_clientsegment' => ['name' => 'billing_price_clientsegment', 'type' => 'int', 'internal' => 'clientsegment'], |
| 56 | 'billing_price_clientsection' => ['name' => 'billing_price_clientsection', 'type' => 'int', 'internal' => 'clientsection'], |
| 57 | 'billing_price_clienttype' => ['name' => 'billing_price_clienttype', 'type' => 'int', 'internal' => 'clienttype'], |
| 58 | 'billing_price_clientcountry' => ['name' => 'billing_price_clientcountry', 'type' => 'string', 'internal' => 'clientcountry'], |
| 59 | 'billing_price_supplier' => ['name' => 'billing_price_supplier', 'type' => 'int', 'internal' => 'supplier'], |
| 60 | 'billing_price_unit' => ['name' => 'billing_price_unit', 'type' => 'int', 'internal' => 'unit'], |
| 61 | 'billing_price_type' => ['name' => 'billing_price_type', 'type' => 'int', 'internal' => 'type'], |
| 62 | 'billing_price_quantity' => ['name' => 'billing_price_quantity', 'type' => 'int', 'internal' => 'quantity'], |
| 63 | 'billing_price_price' => ['name' => 'billing_price_price', 'type' => 'Serializable', 'internal' => 'price'], |
| 64 | 'billing_price_price_new' => ['name' => 'billing_price_price_new', 'type' => 'int', 'internal' => 'priceNew'], |
| 65 | 'billing_price_discount' => ['name' => 'billing_price_discount', 'type' => 'int', 'internal' => 'discount'], |
| 66 | 'billing_price_discountp' => ['name' => 'billing_price_discountp', 'type' => 'int', 'internal' => 'discountPercentage'], |
| 67 | 'billing_price_bonus' => ['name' => 'billing_price_bonus', 'type' => 'int', 'internal' => 'bonus'], |
| 68 | 'billing_price_multiply' => ['name' => 'billing_price_multiply', 'type' => 'bool', 'internal' => 'multiply'], |
| 69 | 'billing_price_currency' => ['name' => 'billing_price_currency', 'type' => 'string', 'internal' => 'currency'], |
| 70 | 'billing_price_start' => ['name' => 'billing_price_start', 'type' => 'DateTime', 'internal' => 'start'], |
| 71 | 'billing_price_end' => ['name' => 'billing_price_end', 'type' => 'DateTime', 'internal' => 'end'], |
| 72 | ]; |
| 73 | |
| 74 | /** |
| 75 | * Has one relation. |
| 76 | * |
| 77 | * @var array<string, array{mapper:class-string, external:string, by?:string, column?:string, conditional?:bool}> |
| 78 | * @since 1.0.0 |
| 79 | */ |
| 80 | public const OWNS_ONE = [ |
| 81 | 'item' => [ |
| 82 | 'mapper' => ItemMapper::class, |
| 83 | 'external' => 'billing_price_item', |
| 84 | ], |
| 85 | 'itemgroup' => [ |
| 86 | 'mapper' => ItemAttributeValueMapper::class, |
| 87 | 'external' => 'billing_price_itemgroup', |
| 88 | ], |
| 89 | 'itemsegment' => [ |
| 90 | 'mapper' => ItemAttributeValueMapper::class, |
| 91 | 'external' => 'billing_price_itemsegment', |
| 92 | ], |
| 93 | 'itemsection' => [ |
| 94 | 'mapper' => ItemAttributeValueMapper::class, |
| 95 | 'external' => 'billing_price_itemsection', |
| 96 | ], |
| 97 | 'itemtype' => [ |
| 98 | 'mapper' => ItemAttributeValueMapper::class, |
| 99 | 'external' => 'billing_price_itemtype', |
| 100 | ], |
| 101 | 'client' => [ |
| 102 | 'mapper' => ClientMapper::class, |
| 103 | 'external' => 'billing_price_client', |
| 104 | ], |
| 105 | 'clientgroup' => [ |
| 106 | 'mapper' => ClientAttributeValueMapper::class, |
| 107 | 'external' => 'billing_price_clientgroup', |
| 108 | ], |
| 109 | 'clientsegment' => [ |
| 110 | 'mapper' => ClientAttributeValueMapper::class, |
| 111 | 'external' => 'billing_price_clientsegment', |
| 112 | ], |
| 113 | 'clientsection' => [ |
| 114 | 'mapper' => ClientAttributeValueMapper::class, |
| 115 | 'external' => 'billing_price_clientsection', |
| 116 | ], |
| 117 | 'clienttype' => [ |
| 118 | 'mapper' => ClientAttributeValueMapper::class, |
| 119 | 'external' => 'billing_price_clienttype', |
| 120 | ], |
| 121 | 'clientcountry' => [ |
| 122 | 'mapper' => CountryMapper::class, |
| 123 | 'external' => 'billing_price_clientcountry', |
| 124 | 'by' => 'code2', |
| 125 | 'column' => 'code2', |
| 126 | 'conditional' => true, |
| 127 | ], |
| 128 | 'supplier' => [ |
| 129 | 'mapper' => SupplierMapper::class, |
| 130 | 'external' => 'billing_price_supplier', |
| 131 | ], |
| 132 | ]; |
| 133 | |
| 134 | /** |
| 135 | * Model to use by the mapper. |
| 136 | * |
| 137 | * @var class-string<T> |
| 138 | * @since 1.0.0 |
| 139 | */ |
| 140 | public const MODEL = Price::class; |
| 141 | |
| 142 | /** |
| 143 | * Primary table. |
| 144 | * |
| 145 | * @var string |
| 146 | * @since 1.0.0 |
| 147 | */ |
| 148 | public const TABLE = 'billing_price'; |
| 149 | |
| 150 | /** |
| 151 | * Primary field name. |
| 152 | * |
| 153 | * @var string |
| 154 | * @since 1.0.0 |
| 155 | */ |
| 156 | public const PRIMARYFIELD = 'billing_price_id'; |
| 157 | |
| 158 | /** |
| 159 | * Find price for a client |
| 160 | * |
| 161 | * @return Price[] |
| 162 | * |
| 163 | * @since 1.0.0 |
| 164 | */ |
| 165 | public static function findClientPrice() : array |
| 166 | { |
| 167 | /* |
| 168 | select * from prices |
| 169 | where |
| 170 | (promoID = ? OR promoID = null) |
| 171 | AND (itemID = ? OR itemID = null) |
| 172 | AND (itemGroup = IN (?) OR itemGroup = null) |
| 173 | AND (itemSegment = ? OR itemSegment = null) |
| 174 | AND (itemSection = ? OR itemSection = null) |
| 175 | AND (productType = ? OR productType = null) |
| 176 | AND (customerID = ? OR customerID = null) |
| 177 | AND (customerGroup IN (?) OR customerGroup = null) |
| 178 | AND (customerCountry = IN (?) OR customerCountry = null) |
| 179 | AND (quantity < ? OR quantity = null) |
| 180 | AND (start <= ? OR start = null) |
| 181 | AND (end >= ? OR start = null) |
| 182 | AND (unit = ? OR unit = null) |
| 183 | */ |
| 184 | |
| 185 | // @todo: allow nested where clause (already possible with the query builder, but not with the mappers) |
| 186 | |
| 187 | return []; |
| 188 | } |
| 189 | } |