diff --git a/Admin/Install/Admin.install.json b/Admin/Install/Admin.install.json new file mode 100644 index 0000000..043bcc5 --- /dev/null +++ b/Admin/Install/Admin.install.json @@ -0,0 +1,10 @@ +[ + { + "description": "Default item segmentation (segment, section, sales group, product group)", + "type": "setting", + "name": "1004800001", + "content": "[\"segment\":1, \"section\":1, \"sales_group\":1, \"product_group\":1]", + "pattern": "", + "module": "ItemManagement" + } +] \ No newline at end of file diff --git a/Admin/Install/Admin.php b/Admin/Install/Admin.php new file mode 100644 index 0000000..d624cda --- /dev/null +++ b/Admin/Install/Admin.php @@ -0,0 +1,43 @@ + __DIR__ . '/Admin.install.json']); + } +} diff --git a/Admin/Install/attributes.json b/Admin/Install/attributes.json index 565cc06..b11e76a 100755 --- a/Admin/Install/attributes.json +++ b/Admin/Install/attributes.json @@ -135,6 +135,27 @@ } ] }, + { + "name": "sales_group", + "l11n": { + "en": "Sales Group", + "de": "Umsatzgruppe" + }, + "value_type": 1, + "is_custom_allowed": false, + "validation_pattern": "", + "is_required": true, + "default_value": "", + "values": [ + { + "value": 1, + "l11n": { + "en": "Sales Group 1", + "de": "Umsatzgruppe 1" + } + } + ] + }, { "name": "product_group", "l11n": { @@ -150,8 +171,8 @@ { "value": 1, "l11n": { - "en": "Group 1", - "de": "Gruppe 1" + "en": "Product Group 1", + "de": "Produktgruppe 1" } } ] diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php index 34c33ec..185e5ee 100755 --- a/Admin/Routes/Web/Api.php +++ b/Admin/Routes/Web/Api.php @@ -29,7 +29,7 @@ return [ ], ], ], - '^.*/item/attribute.*$' => [ + '^.*/item/attribute$' => [ [ 'dest' => '\Modules\ItemManagement\Controller\ApiAttributeController:apiItemAttributeCreate', 'verb' => RouteVerb::PUT, @@ -49,6 +49,86 @@ return [ ], ], ], + '^.*/item/attribute/type$' => [ + [ + 'dest' => '\Modules\ItemManagement\Controller\ApiAttributeController:apiItemAttributeTypeCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SALES_ITEM, + ], + ], + [ + 'dest' => '\Modules\ItemManagement\Controller\ApiAttributeController:apiItemAttributeTypeUpdate', + 'verb' => RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SALES_ITEM, + ], + ], + ], + '^.*/item/attribute/type/l11n$' => [ + [ + 'dest' => '\Modules\ItemManagement\Controller\ApiAttributeController:apiItemAttributeTypeL11nCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SALES_ITEM, + ], + ], + [ + 'dest' => '\Modules\ItemManagement\Controller\ApiAttributeController:apiItemAttributeTypeL11nUpdate', + 'verb' => RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SALES_ITEM, + ], + ], + ], + '^.*/item/attribute/value$' => [ + [ + 'dest' => '\Modules\ItemManagement\Controller\ApiAttributeController:apiItemAttributeValueCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SALES_ITEM, + ], + ], + [ + 'dest' => '\Modules\ItemManagement\Controller\ApiAttributeController:apiItemAttributeValueUpdate', + 'verb' => RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SALES_ITEM, + ], + ], + ], + '^.*/item/attribute/value$' => [ + [ + 'dest' => '\Modules\ItemManagement\Controller\ApiAttributeController:apiItemAttributeValueL11nCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SALES_ITEM, + ], + ], + [ + 'dest' => '\Modules\ItemManagement\Controller\ApiAttributeController:apiItemAttributeValueL11nUpdate', + 'verb' => RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::SALES_ITEM, + ], + ], + ], '^.*/item/l11n$' => [ [ 'dest' => '\Modules\ItemManagement\Controller\ApiController:apiItemL11nCreate', diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 8669fec..23d1d47 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -15,6 +15,7 @@ declare(strict_types=1); namespace Modules\ItemManagement\Controller; use Modules\Admin\Models\NullAccount; +use Modules\ItemManagement\Models\Attribute\ItemAttributeTypeMapper; use Modules\ItemManagement\Models\Item; use Modules\ItemManagement\Models\ItemL11nMapper; use Modules\ItemManagement\Models\ItemL11nTypeMapper; @@ -24,11 +25,14 @@ use Modules\ItemManagement\Models\ItemPriceStatus; use Modules\ItemManagement\Models\ItemRelationType; use Modules\ItemManagement\Models\ItemRelationTypeMapper; use Modules\ItemManagement\Models\ItemStatus; +use Modules\ItemManagement\Models\PermissionCategory; +use Modules\ItemManagement\Models\SettingsEnum as ItemSettingsEnum; use Modules\Media\Models\Collection; use Modules\Media\Models\CollectionMapper; use Modules\Media\Models\MediaMapper; use Modules\Media\Models\MediaTypeMapper; use Modules\Media\Models\PathSettings; +use phpOMS\Account\PermissionType; use phpOMS\Localization\BaseStringL11n; use phpOMS\Localization\BaseStringL11nType; use phpOMS\Localization\ISO4217CharEnum; @@ -36,6 +40,7 @@ use phpOMS\Localization\NullBaseStringL11nType; use phpOMS\Message\Http\HttpRequest; use phpOMS\Message\Http\HttpResponse; use phpOMS\Message\Http\RequestStatusCode; +use phpOMS\Message\NotificationLevel; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Model\Message\FormValidation; @@ -215,9 +220,40 @@ final class ApiController extends Controller ); } + $this->createItemSegmentation($request, $response, $item); + $this->createStandardCreateResponse($request, $response, $item); } + private function createItemSegmentation(RequestAbstract $request, ResponseAbstract $response, Item $item) : void + { + /** @var \Model\Setting $settings */ + $settings = $this->app->appSettings->get(null, [ + ItemSettingsEnum::DEFAULT_SEGMENTATION, + ]); + + $segmentation = \json_decode($settings->content, true); + if ($segmentation === false) { + return; + } + + $types = ItemAttributeTypeMapper::get() + ->where('name', \array_keys($segmentation), 'IN') + ->execute(); + + foreach ($types as $type) { + $internalResponse = clone $response; + $internalRequest = new HttpRequest(new HttpUri('')); + + $internalRequest->header->account = $request->header->account; + $internalRequest->setData('ref', $item->id); + $internalRequest->setData('type', $type->id); + $internalRequest->setData('value_id', $segmentation[$type->name]); + + $this->app->moduleManager->get('ItemManagement', 'ApiAttribute')->apiItemAttributeCreate($internalRequest, $internalResponse); + } + } + /** * Create directory for an account * @@ -797,4 +833,60 @@ final class ApiController extends Controller return []; } + + /** + * Api method to update Note + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiNoteUpdate(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void + { + $accountId = $request->header->account; + if (!$this->app->accountManager->get($accountId)->hasPermission( + PermissionType::MODIFY, $this->app->unitId, $this->app->appId, self::NAME, PermissionCategory::NOTE, $request->getDataInt('id')) + ) { + $this->fillJsonResponse($request, $response, NotificationLevel::HIDDEN, '', '', []); + $response->header->status = RequestStatusCode::R_403; + + return; + } + + $this->app->moduleManager->get('Editor', 'Api')->apiEditorUpdate($request, $response, $data); + } + + /** + * Api method to delete Note + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiNoteDelete(RequestAbstract $request, ResponseAbstract $response, array $data = []) : void + { + $accountId = $request->header->account; + if (!$this->app->accountManager->get($accountId)->hasPermission( + PermissionType::DELETE, $this->app->unitId, $this->app->appId, self::NAME, PermissionCategory::NOTE, $request->getDataInt('id')) + ) { + $this->fillJsonResponse($request, $response, NotificationLevel::HIDDEN, '', '', []); + $response->header->status = RequestStatusCode::R_403; + + return; + } + + $this->app->moduleManager->get('Editor', 'Api')->apiEditorDelete($request, $response, $data); + } } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 6d2e41f..3ee9594 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -29,6 +29,7 @@ use Modules\ItemManagement\Models\ItemL11nTypeMapper; use Modules\ItemManagement\Models\ItemMapper; use Modules\Media\Models\MediaMapper; use Modules\Media\Models\MediaTypeMapper; +use Modules\Organization\Models\Attribute\UnitAttributeMapper; use Modules\Organization\Models\UnitMapper; use phpOMS\Asset\AssetType; use phpOMS\Contract\RenderableInterface; @@ -55,7 +56,7 @@ use phpOMS\Views\View; final class BackendController extends Controller { /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -84,7 +85,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -113,7 +114,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -148,7 +149,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -178,7 +179,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -213,7 +214,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -230,7 +231,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -247,7 +248,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -264,7 +265,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -281,7 +282,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -302,7 +303,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -323,7 +324,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -344,7 +345,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -417,6 +418,15 @@ final class BackendController extends Controller $view->data['itemImage'] = $itemImage; + $businessStart = UnitAttributeMapper::get() + ->with('type') + ->with('value') + ->where('ref', $this->app->unitId) + ->where('type/name', 'business_year_start') + ->execute(); + + $view->data['business_start'] = $businessStart->id === 0 ? 1 : $businessStart->value->getValue(); + // @todo this one should already be loaded in the backend application no????????? /** @var \Model\Setting $settings */ $settings = $this->app->appSettings->get(null, [ @@ -469,9 +479,11 @@ final class BackendController extends Controller $audits = AuditMapper::getAll() ->where('type', StringUtils::intHash(ItemMapper::class)) ->where('module', 'ItemManagement') - ->where('ref', $item->id) + ->where('ref', (string) $item->id) ->execute(); + // @todo join audit with files, attributes, localization, prices, notes, ... + $view->data['audits'] = $audits; /** @var \Modules\Media\Models\Media[] $files */ @@ -483,61 +495,16 @@ final class BackendController extends Controller $view->data['files'] = $files; - $mediaListView = new \Modules\Media\Theme\Backend\Components\Media\ListView($this->app->l11nManager, $request, $response); - $mediaListView->setTemplate('/Modules/Media/Theme/Backend/Components/Media/list'); - $view->data['medialist'] = $mediaListView; + $view->data['media-upload'] = new \Modules\Media\Theme\Backend\Components\Upload\BaseView($this->app->l11nManager, $request, $response); + $view->data['note'] = new \Modules\Editor\Theme\Backend\Components\Note\BaseView($this->app->l11nManager, $request, $response); - // stats - if ($this->app->moduleManager->isActive('Billing')) { - $ytd = SalesBillMapper::getSalesByItemId($item->id, new SmartDateTime('Y-01-01'), new SmartDateTime('now')); - $mtd = SalesBillMapper::getSalesByItemId($item->id, new SmartDateTime('Y-m-01'), new SmartDateTime('now')); - $avg = SalesBillMapper::getAvgSalesPriceByItemId($item->id, (new SmartDateTime('now'))->smartModify(-1), new SmartDateTime('now')); - - $lastOrder = SalesBillMapper::getLastOrderDateByItemId($item->id); - - $newestInvoices = SalesBillMapper::getAll() - ->with('type') - ->with('type/l11n') - ->where('type/transferType', BillTransferType::SALES) - ->where('type/l11n/language', $response->header->l11n->language) - ->sort('id', OrderType::DESC) - ->limit(5) - ->execute(); - - $topCustomers = SalesBillMapper::getItemTopClients($item->id, new SmartDateTime('Y-01-01'), new SmartDateTime('now'), 5); - $allInvoices = SalesBillMapper::getItemBills($item->id, new SmartDateTime('Y-01-01'), new SmartDateTime('now')); - $regionSales = []; - $countrySales = SalesBillMapper::getItemCountrySales($item->id, new SmartDateTime('Y-01-01'), new SmartDateTime('now'), 5); - $monthlySalesCosts = SalesBillMapper::getItemMonthlySalesCosts($item->id, (new SmartDateTime('now'))->createModify(-1), new SmartDateTime('now')); - } else { - $ytd = new Money(); - $mtd = new Money(); - $avg = new Money(); - $lastOrder = null; - $newestInvoices = []; - $allInvoices = []; - $topCustomers = []; - $regionSales = []; - $countrySales = []; - $monthlySalesCosts = []; - } - - $view->data['ytd'] = $ytd; - $view->data['mtd'] = $mtd; - $view->data['avg'] = $avg; - $view->data['lastOrder'] = $lastOrder; - $view->data['newestInvoices'] = $newestInvoices; - $view->data['allInvoices'] = $allInvoices; - $view->data['topCustomers'] = $topCustomers; - $view->data['regionSales'] = $regionSales; - $view->data['countrySales'] = $countrySales; - $view->data['monthlySalesCosts'] = $monthlySalesCosts; + $view->data['hasBilling'] = $this->app->moduleManager->isActive('Billing'); return $view; } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -554,7 +521,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -571,7 +538,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -588,7 +555,7 @@ final class BackendController extends Controller } /** - * Routing end-point for application behaviour. + * Routing end-point for application behavior. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response diff --git a/Models/Attribute/ItemAttributeValueMapper.php b/Models/Attribute/ItemAttributeValueMapper.php index 548fc10..badf99e 100644 --- a/Models/Attribute/ItemAttributeValueMapper.php +++ b/Models/Attribute/ItemAttributeValueMapper.php @@ -59,6 +59,7 @@ final class ItemAttributeValueMapper extends DataMapperFactory 'mapper' => ItemAttributeValueL11nMapper::class, 'table' => 'itemmgmt_attr_value_l11n', 'self' => 'itemmgmt_attr_value_l11n_value', + 'column' => 'content', 'external' => null, ], ]; diff --git a/Models/ItemMapper.php b/Models/ItemMapper.php index 85b3078..41c98f6 100755 --- a/Models/ItemMapper.php +++ b/Models/ItemMapper.php @@ -20,8 +20,10 @@ use Modules\Media\Models\Media; use Modules\Media\Models\MediaMapper; use Modules\Media\Models\MediaType; use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; +use phpOMS\DataStorage\Database\Query\Builder; use phpOMS\Localization\BaseStringL11n; use phpOMS\Localization\BaseStringL11nType; +use phpOMS\Stdlib\Base\FloatInt; /** * Item mapper class. diff --git a/Models/PermissionCategory.php b/Models/PermissionCategory.php index 3cfe9c9..72c134f 100755 --- a/Models/PermissionCategory.php +++ b/Models/PermissionCategory.php @@ -17,7 +17,7 @@ namespace Modules\ItemManagement\Models; use phpOMS\Stdlib\Base\Enum; /** - * Permision state enum. + * Permission category enum. * * @package Modules\ItemManagement\Models * @license OMS License 2.0 @@ -33,4 +33,6 @@ abstract class PermissionCategory extends Enum public const STOCK_ITEM = 3; public const ATTRIBUTE = 4; + + public const NOTE = 4; } diff --git a/Models/SettingsEnum.php b/Models/SettingsEnum.php new file mode 100644 index 0000000..0453a05 --- /dev/null +++ b/Models/SettingsEnum.php @@ -0,0 +1,30 @@ + [ 'QA' => 'QA.', 'QM' => 'Qm.', 'Quantity' => 'Antal', - 'QuantityUnit' => 'Mængden af ​​mængde', + 'QuantityUnit' => "Mængden af \u{200b}\u{200b}mængde", 'RecentInvoices' => '', 'ReorderLevel' => 'Ombestillingsniveau', 'Reserved' => 'Reserveret', diff --git a/Theme/Backend/Lang/fr.lang.php b/Theme/Backend/Lang/fr.lang.php index 44faba1..dbdaa69 100755 --- a/Theme/Backend/Lang/fr.lang.php +++ b/Theme/Backend/Lang/fr.lang.php @@ -113,7 +113,7 @@ return ['ItemManagement' => [ 'Properties' => 'Propriétés', 'Property' => 'Propriété', 'Purchase' => 'Acheter', - 'PurchasePrice' => 'Prix ​​d\'achat', + 'PurchasePrice' => "Prix \u{200b}\u{200b}d'achat", 'Purchasing' => 'Achat', 'QA' => 'Qa', 'QM' => 'Qm', @@ -124,7 +124,7 @@ return ['ItemManagement' => [ 'Reserved' => 'Réservé', 'SN' => 'Sn', 'Sales' => 'Ventes', - 'SalesPrice' => 'Prix ​​de vente', + 'SalesPrice' => "Prix \u{200b}\u{200b}de vente", 'SalesPricing' => '', 'Segment' => 'Segment', 'ShelfLife' => 'Durée de vie', diff --git a/Theme/Backend/attribute-type.tpl.php b/Theme/Backend/attribute-type.tpl.php index 6e6ce67..5f8fec5 100755 --- a/Theme/Backend/attribute-type.tpl.php +++ b/Theme/Backend/attribute-type.tpl.php @@ -49,7 +49,7 @@ echo $this->data['nav']->render(); ?>
- +
@@ -74,7 +74,7 @@ echo $this->data['nav']->render(); ?>
getHtml('Language', '0', '0'); ?>download
- +
diff --git a/Theme/Backend/item-create.tpl.php b/Theme/Backend/item-create.tpl.php index e0a2503..7893bdd 100755 --- a/Theme/Backend/item-create.tpl.php +++ b/Theme/Backend/item-create.tpl.php @@ -593,7 +593,7 @@ echo $this->data['nav']->render(); ?> $footerView->setPage(1); ?>
- +
diff --git a/Theme/Backend/item-profile.tpl.php b/Theme/Backend/item-profile.tpl.php index 8f84da3..c2f6dfe 100755 --- a/Theme/Backend/item-profile.tpl.php +++ b/Theme/Backend/item-profile.tpl.php @@ -12,28 +12,26 @@ */ declare(strict_types=1); +use Modules\Billing\Models\BillTransferType; +use Modules\Billing\Models\SalesBillMapper; use Modules\Media\Models\NullMedia; +use phpOMS\DataStorage\Database\Query\OrderType; use phpOMS\Localization\ISO639Enum; use phpOMS\Localization\Money; use phpOMS\Localization\NullLocalization; use phpOMS\Message\Http\HttpHeader; +use phpOMS\Stdlib\Base\SmartDateTime; use phpOMS\Uri\UriFactory; /** @var \Modules\ItemManagement\Models\Item $item */ $item = $this->data['item']; -$attribute = $item->attributes; - $notes = $item->notes; $files = $item->files; $itemImage = $this->getData('itemImage') ?? new NullMedia(); -$newestInvoices = $this->data['newestInvoices'] ?? []; $allInvoices = $this->data['allInvoices'] ?? []; $topCustomers = $this->getData('topCustomers') ?? [[], []]; -$regionSales = $this->data['regionSales'] ?? []; -$countrySales = $this->data['countrySales'] ?? []; -$monthlySalesCosts = $this->data['monthlySalesCosts'] ?? []; $attributeView = $this->data['attributeView']; $l11nView = $this->data['l11nView']; @@ -48,21 +46,21 @@ echo $this->data['nav']->render();
@@ -118,19 +116,18 @@ echo $this->data['nav']->render();
+ data['hasBilling']) : ?>
getHtml('Logs'); ?>download
getHtml('YTDSales'); ?>: - getCurrency($this->getData('ytd')); ?> + getCurrency(SalesBillMapper::getItemNetSales($item->id, SmartDateTime::startOfYear($this->data['business_start']), new \DateTime('now')), format: 'medium'); ?>
getHtml('MTDSales'); ?>: - getCurrency($this->getData('mtd')); ?> + getCurrency(SalesBillMapper::getItemNetSales($item->id, SmartDateTime::startOfMonth(), new \DateTime('now')), format: 'medium'); ?>
getHtml('ILV'); ?>: - -
getHtml('MRR'); ?>: - + getCurrency(SalesBillMapper::getILVHistoric($item->id), format: 'medium'); ?>
@@ -141,13 +138,11 @@ echo $this->data['nav']->render();
getHtml('LastOrder'); ?>: - getData('lastOrder') !== null ? $this->getData('lastOrder')->format('Y-m-d H:i') : ''; ?> + id)?->format('Y-m-d'); ?>
getHtml('PriceChange'); ?>:
getHtml('Created'); ?>: createdAt->format('Y-m-d H:i'); ?> -
getHtml('Modified'); ?>: -
@@ -160,7 +155,7 @@ echo $this->data['nav']->render();
getHtml('SalesPrice'); ?>: getCurrency($item->salesPrice, format: 'medium'); ?>
getHtml('PurchasePrice'); ?>: - getCurrency($item->purchasePrice); ?> + getCurrency($item->purchasePrice, format: 'medium'); ?>
getHtml('Margin'); ?>: getNumeric( $item->salesPrice->getInt() === 0 @@ -168,12 +163,13 @@ echo $this->data['nav']->render(); : ($item->salesPrice->getInt() - $item->purchasePrice->getInt()) / $item->salesPrice->getInt() * 100 , 'short'); ?> %
getHtml('AvgPrice'); ?>: - getCurrency($this->getData('avg')); ?> + getCurrency(SalesBillMapper::getItemAvgSalesPrice($item->id, (new SmartDateTime('now'))->smartModify(-1), new SmartDateTime('now')), format: 'medium'); ?>
+
@@ -183,7 +179,7 @@ echo $this->data['nav']->render();
- +
getHtml('Title'); ?> @@ -208,7 +204,7 @@ echo $this->data['nav']->render();