continue implementations

This commit is contained in:
Dennis Eichhorn 2024-01-12 00:30:21 +00:00
parent 42e9c0121c
commit 17fb0226d4
34 changed files with 490 additions and 783 deletions

View File

@ -1,43 +1,4 @@
{
"warehousemgmt_item": {
"name": "warehousemgmt_item",
"fields": {
"warehousemgmt_item_id": {
"name": "warehousemgmt_item_id",
"type": "INT",
"null": false,
"primary": true,
"autoincrement": true
},
"warehousemgmt_item_item": {
"name": "warehousemgmt_item_item",
"type": "INT",
"null": false,
"foreignTable": "itemmgmt_item",
"foreignKey": "itemmgmt_item_id"
},
"warehousemgmt_item_hassn": {
"name": "warehousemgmt_item_hassn",
"type": "TINYINT(1)",
"null": false
},
"warehousemgmt_item_haslot": {
"name": "warehousemgmt_item_haslot",
"type": "TINYINT(1)",
"null": false
},
"warehousemgmt_item_hasstock": {
"name": "warehousemgmt_item_hasstock",
"type": "TINYINT(1)",
"null": false
},
"warehousemgmt_item_negative": {
"name": "warehousemgmt_item_negative",
"type": "TINYINT",
"null": false
}
}
},
"warehousemgmt_stock": {
"name": "warehousemgmt_stock",
"fields": {
@ -307,6 +268,11 @@
"type": "TINYINT(1)",
"null": false
},
"warehousemgmt_attr_type_repeatable": {
"name": "warehousemgmt_attr_type_repeatable",
"type": "TINYINT(1)",
"null": false
},
"warehousemgmt_attr_type_required": {
"description": "Every item must have this attribute type if set to true.",
"name": "warehousemgmt_attr_type_required",
@ -551,16 +517,17 @@
"warehousemgmt_stock_distribution_lot": {
"name": "warehousemgmt_stock_distribution_lot",
"type": "INT",
"null": false,
"null": true,
"default": null,
"foreignTable": "warehousemgmt_lot",
"foreignKey": "warehousemgmt_lot_id"
},
"warehousemgmt_stock_distribution_shelf": {
"name": "warehousemgmt_stock_distribution_shelf",
"warehousemgmt_stock_distribution_stock": {
"name": "warehousemgmt_stock_distribution_stock",
"type": "INT",
"null": false,
"foreignTable": "warehousemgmt_stockshelf",
"foreignKey": "warehousemgmt_stockshelf_id"
"foreignTable": "warehousemgmt_stock",
"foreignKey": "warehousemgmt_stock_id"
},
"warehousemgmt_stock_distribution_stocktype": {
"name": "warehousemgmt_stock_distribution_stocktype",
@ -606,12 +573,12 @@
"foreignTable": "warehousemgmt_lot",
"foreignKey": "warehousemgmt_lot_id"
},
"warehousemgmt_stock_distribution_history_shelf": {
"name": "warehousemgmt_stock_distribution_history_shelf",
"warehousemgmt_stock_distribution_history_stock": {
"name": "warehousemgmt_stock_distribution_history_stock",
"type": "INT",
"null": false,
"foreignTable": "warehousemgmt_stockshelf",
"foreignKey": "warehousemgmt_stockshelf_id"
"foreignTable": "warehousemgmt_stock",
"foreignKey": "warehousemgmt_stock_id"
},
"warehousemgmt_stock_distribution_history_stocktype": {
"name": "warehousemgmt_stock_distribution_history_stocktype",
@ -653,11 +620,6 @@
"type": "BIGINT",
"null": false
},
"warehousemgmt_stock_transaction_pprice": {
"name": "warehousemgmt_stock_transaction_pprice",
"type": "BIGINT",
"null": false
},
"warehousemgmt_stock_transaction_type": {
"name": "warehousemgmt_stock_transaction_type",
"type": "INT",
@ -677,12 +639,12 @@
"foreignTable": "warehousemgmt_lot",
"foreignKey": "warehousemgmt_lot_id"
},
"warehousemgmt_stock_transaction_from_shelf": {
"name": "warehousemgmt_stock_transaction_from_shelf",
"warehousemgmt_stock_transaction_from_stock": {
"name": "warehousemgmt_stock_transaction_from_stock",
"type": "INT",
"null": false,
"foreignTable": "warehousemgmt_stockshelf",
"foreignKey": "warehousemgmt_stockshelf_id"
"foreignTable": "warehousemgmt_stock",
"foreignKey": "warehousemgmt_stock_id"
},
"warehousemgmt_stock_transaction_from_stocktype": {
"name": "warehousemgmt_stock_transaction_from_stocktype",
@ -698,12 +660,12 @@
"foreignTable": "warehousemgmt_lot",
"foreignKey": "warehousemgmt_lot_id"
},
"warehousemgmt_stock_transaction_to_shelf": {
"name": "warehousemgmt_stock_transaction_to_shelf",
"warehousemgmt_stock_transaction_to_stock": {
"name": "warehousemgmt_stock_transaction_to_stock",
"type": "INT",
"null": false,
"foreignTable": "warehousemgmt_stockshelf",
"foreignKey": "warehousemgmt_stockshelf_id"
"foreignTable": "warehousemgmt_stock",
"foreignKey": "warehousemgmt_stock_id"
},
"warehousemgmt_stock_transaction_to_stocktype": {
"name": "warehousemgmt_stock_transaction_to_stocktype",

View File

@ -18,14 +18,17 @@ use Modules\Billing\Models\BillElement;
use Modules\Billing\Models\BillMapper;
use Modules\Billing\Models\BillStatus;
use Modules\Billing\Models\BillTransferType;
use Modules\ItemManagement\Models\StockIdentifierType;
use Modules\WarehouseManagement\Models\Stock;
use Modules\WarehouseManagement\Models\StockDistribution;
use Modules\WarehouseManagement\Models\StockDistributionMapper;
use Modules\WarehouseManagement\Models\StockLocation;
use Modules\WarehouseManagement\Models\StockLocationMapper;
use Modules\WarehouseManagement\Models\StockMapper;
use Modules\WarehouseManagement\Models\StockMovement;
use Modules\WarehouseManagement\Models\StockMovementMapper;
use Modules\WarehouseManagement\Models\StockMovementState;
use Modules\WarehouseManagement\Models\StockMovementType;
use Modules\WarehouseManagement\Models\StockTransaction;
use Modules\WarehouseManagement\Models\StockTransactionMapper;
use Modules\WarehouseManagement\Models\StockTransactionState;
use Modules\WarehouseManagement\Models\StockTransactionType;
use Modules\WarehouseManagement\Models\StockShelf;
use Modules\WarehouseManagement\Models\StockShelfMapper;
use phpOMS\Message\Http\RequestStatusCode;
@ -245,157 +248,182 @@ final class ApiController extends Controller
) : void
{
// Directly/manually creating a transaction is handled in the API Create/Update functions.
$isBillElement = $new instanceof BillElement;
/** @var \Modules\Billing\Models\Bill|\Modules\Billing\Models\BillElement $new */
/** @var \Modules\Billing\Models\Bill $bill */
$bill = BillMapper::get()
->with('type')
->with('elements')
->with('elements/item')
->with('supplier')
->with('client')
->where('id', $new instanceof BillElement ? $new->bill->id : $new->id)
->where('id', $isBillElement ? $new->bill->id : $new->id)
->execute();
// Has stock movement?
if ($bill->id !== 0 && !$bill->type->transferStock) {
if (!$bill->type->transferStock) {
return;
}
$billElements = $isBillElement ? [$new] : $bill->elements;
// @todo check if old element existed -> removed/changed item
// @todo we cannot have transaction->to and transaction->from be the id of client/supplier because the IDs can overlap
$transaction = new StockMovement();
if ($trigger === 'POST:Module:Billing-bill_element-create') {
/** @var \Modules\Billing\Models\BillElement $new */
$transaction->billElement = $new->id;
$transaction->state = StockMovementState::DRAFT;
// @todo load default stock movement for bill type/organization settings (default stock location, default lot order e.g. FIFO/LIFO)
// @todo find stock candidates
$transaction->type = StockMovementType::TRANSFER; // @todo depends on bill type
$transaction->quantity = $new->getQuantity(); // @todo may require split quantity if not sufficient available from one lost
// @todo allow consignment bills
// @todo allow to pass stocklocation for entire bill to avoid re-defining it
// @todo allow custom stock location
if ($bill->type->sign > 0) {
// Handle from
// @todo find possible candidate based on defined default stock for bill type/org/location
// Handle to
if (($bill->client?->id ?? 0) !== 0) {
// @todo remove phpstan this is just a bug fix until phpstan fixes this bug
/** @phpstan-ignore-next-line */
$transaction->to = $bill->client->id;
} elseif (($bill->supplier?->id ?? 0) !== 0) {
// @todo remove phpstan this is just a bug fix until phpstan fixes this bug
/** @phpstan-ignore-next-line */
$transaction->to = $bill->supplier->id;
}
if ($bill->type->transferType === BillTransferType::SALES) {
$transaction->subtype = StockMovementType::SALE;
} elseif ($bill->type->transferType === BillTransferType::PURCHASE) {
$transaction->subtype = StockMovementType::PURCHASE;
}
} else {
// Handle from
if (($bill->client?->id ?? 0) !== 0) {
// @todo remove phpstan this is just a bug fix until phpstan fixes this bug
/** @phpstan-ignore-next-line */
$transaction->from = $bill->client->id;
} elseif (($bill->supplier?->id ?? 0) !== 0) {
// @todo remove phpstan this is just a bug fix until phpstan fixes this bug
/** @phpstan-ignore-next-line */
$transaction->from = $bill->supplier->id;
}
// Handle to
// @todo find possible candidate based on defined default stock for bill type/org/location
if ($bill->type->transferType === BillTransferType::SALES
|| $bill->type->transferType === BillTransferType::PURCHASE
) {
$transaction->subtype = StockMovementType::RETURN;
}
// @todo How to differentiate between stock movement
// invoice with prior delivery note(s),
// invoice with partly delivery note(s),
// invoice with no delivery note
// @todo Handle bill drafts (now only finalization moves stock, how do we reserve stock?)
foreach ($billElements as $element) {
if ($element->item === 0 || $element->item === null
|| $element->item->stockIdentifier === StockIdentifierType::NONE
) {
continue;
}
return;
} elseif ($trigger === 'POST:Module:Billing-bill_element-update') {
/** @var \Modules\Billing\Models\BillElement $new */
/** @var \Modules\Billing\Models\BillElement $old */
/** @var \Modules\WarehouseManagement\Models\StockMovement[] $transactions */
$transactions = StockMovementMapper::getAll()
->where('billElement', $new->id)
$dist = StockDistributionMapper::get()
->where('item', $element->item->id)
->where('stock', 1) // @todo fix
->where('stockType', 1) // @todo fix
->where('lot', $element->item->stockIdentifier === StockIdentifierType::NUMBER ? null : '')
->execute();
/*
if ($new->item === $old->item) {
// quantity change
// lot changes
// stock changes
// all other changes ignore!
// check availability again, if not available abort bill
// maybe from an algorithmic point of view first set quantity to zero
// and then do normal algorithm like for a new element
}
*/
if ($new->item !== $old->item) {
StockMovementMapper::delete()->execute($transactions);
$transaction = new StockTransaction();
$this->eventBillUpdateInternal(
$account, $old, $new,
$type, 'POST:Module:Billing-bill_element-create', $module, $ref, $content, $ip
);
}
// @todo how to handle only reserving items for drafted bills (not yet shipped)
return;
} elseif ($trigger === 'POST:Module:Billing-bill_element-delete') {
/** @var \Modules\Billing\Models\BillElement $new */
/** @var \Modules\WarehouseManagement\Models\StockMovement[] $transactions */
$transactions = StockMovementMapper::getAll()
->where('billElement', $new->id)
->execute();
if ($trigger === 'POST:Module:Billing-bill_element-create') {
// Check stock availability
if ($bill->type->sign < 0 && $dist->quantity < $element->quantity) {
continue;
}
StockMovementMapper::delete()->execute($transactions);
/** @var \Modules\Billing\Models\BillElement $new */
return;
} elseif ($trigger === 'POST:Module:Billing-bill-delete') {
/** @var \Modules\Billing\Models\Bill $new */
/** @var \Modules\Billing\Models\Bill $bill */
$bill = BillMapper::get()
->with('type')
->with('elements')
->with('supplier')
->with('client')
->where('id', $new->id)
->execute();
// Handle stock quantity
/////////////////////////////////////////////////////////////////
foreach ($bill->elements as $element) {
/** @var \Modules\WarehouseManagement\Models\StockMovement[] $transactions */
$transactions = StockMovementMapper::getAll()
->where('billElement', $element->id)
// @todo handle stock returns!!!
if ($bill->type->sign < 0) {
$dist->quantity -= $element->quantity;
StockDistributionMapper::update()->execute($dist);
} else {
if ($dist->id === 0) {
$dist = new StockDistribution();
$dist->item = $element->item->id;
$dist->quantity = $element->quantity;
$dist->lot = null; // @todo handle correct
$dist->stock = 1; // @todo handle correct
$dist->stockType = 1; // @todo handle correct
StockDistributionMapper::create()->execute($dist);
} else {
$dist->quantity += $element->quantity;
StockDistributionMapper::update()->execute($dist);
}
}
// Handle transfer protocol
/////////////////////////////////////////////////////////////////
$transaction->billElement = $new->id;
$transaction->state = StockTransactionState::DRAFT;
// @todo load default stock movement for bill type/organization settings (default stock location, default lot order e.g. FIFO/LIFO)
// @todo find stock candidates
$transaction->type = StockTransactionType::TRANSFER; // @todo depends on bill type
$transaction->quantity = $new->getQuantity(); // @todo may require split quantity if not sufficient available from one lost
// @todo allow consignment bills
// @todo allow to pass stocklocation for entire bill to avoid re-defining it
// @todo allow custom stock location
if ($bill->type->sign > 0) {
// Handle from
// @todo find possible candidate based on defined default stock for bill type/org/location
// Handle to
if (($bill->client?->id ?? 0) !== 0) {
// @todo remove phpstan this is just a bug fix until phpstan fixes this bug
/** @phpstan-ignore-next-line */
$transaction->to = $bill->client->id;
} elseif (($bill->supplier?->id ?? 0) !== 0) {
// @todo remove phpstan this is just a bug fix until phpstan fixes this bug
/** @phpstan-ignore-next-line */
$transaction->to = $bill->supplier->id;
}
if ($bill->type->transferType === BillTransferType::SALES) {
$transaction->subtype = StockTransactionType::SALE;
} elseif ($bill->type->transferType === BillTransferType::PURCHASE) {
$transaction->subtype = StockTransactionType::PURCHASE;
}
} else {
// Handle from
if (($bill->client?->id ?? 0) !== 0) {
// @todo remove phpstan this is just a bug fix until phpstan fixes this bug
/** @phpstan-ignore-next-line */
$transaction->from = $bill->client->id;
} elseif (($bill->supplier?->id ?? 0) !== 0) {
// @todo remove phpstan this is just a bug fix until phpstan fixes this bug
/** @phpstan-ignore-next-line */
$transaction->from = $bill->supplier->id;
}
// Handle to
// @todo find possible candidate based on defined default stock for bill type/org/location
if ($bill->type->transferType === BillTransferType::SALES
|| $bill->type->transferType === BillTransferType::PURCHASE
) {
$transaction->subtype = StockTransactionType::RETURN;
}
}
StockTransactionMapper::create()->execute($transaction);
} elseif ($trigger === 'POST:Module:Billing-bill_element-update') {
/** @var \Modules\Billing\Models\BillElement $new */
/** @var \Modules\Billing\Models\BillElement $old */
/** @var \Modules\WarehouseManagement\Models\StockTransaction[] $transactions */
$transactions = StockTransactionMapper::getAll()
->where('billElement', $new->id)
->execute();
StockMovementMapper::delete()->execute($transactions);
// @todo consider not to delete but mark as deleted?
}
/*
if ($new->item === $old->item) {
// quantity change
// lot changes
// stock changes
// all other changes ignore!
// check availability again, if not available abort bill
// maybe from an algorithmic point of view first set quantity to zero
// and then do normal algorithm like for a new element
}
*/
if ($new->item !== $old->item) {
StockTransactionMapper::delete()->execute($transactions);
return;
} elseif ($trigger === 'POST:Module:Billing-bill-update') {
// is receiver update -> change all movements
// is status update -> change all movements (delete = delete)
$this->eventBillUpdateInternal(
$account, $old, $new,
$type, 'POST:Module:Billing-bill_element-create', $module, $ref, $content, $ip
);
}
} elseif ($trigger === 'POST:Module:Billing-bill_element-delete') {
/** @var \Modules\Billing\Models\BillElement $new */
/** @var \Modules\WarehouseManagement\Models\StockTransaction[] $transactions */
$transactions = StockTransactionMapper::getAll()
->where('billElement', $new->id)
->execute();
/** @var \Modules\Billing\Models\Bill $new */
if ($new->status === BillStatus::DELETED) {
$this->eventBillUpdateInternal(
$account, $old, $new,
$type, 'POST:Module:Billing-bill-delete', $module, $ref, $content, $ip
);
} elseif ($new->status === BillStatus::ARCHIVED) {
StockTransactionMapper::delete()->execute($transactions);
} elseif ($trigger === 'POST:Module:Billing-bill-delete') {
/** @var \Modules\Billing\Models\Bill $new */
/** @var \Modules\Billing\Models\Bill $bill */
$bill = BillMapper::get()
->with('type')
@ -406,20 +434,48 @@ final class ApiController extends Controller
->execute();
foreach ($bill->elements as $element) {
/** @var \Modules\WarehouseManagement\Models\StockMovement[] $transactions */
$transactions = StockMovementMapper::getAll()
/** @var \Modules\WarehouseManagement\Models\StockTransaction[] $transactions */
$transactions = StockTransactionMapper::getAll()
->where('billElement', $element->id)
->execute();
foreach ($transactions as $transaction) {
$transaction->state = StockMovementState::TRANSIT; // @todo change to more specific
StockTransactionMapper::delete()->execute($transactions);
// @todo consider not to delete but mark as deleted?
}
} elseif ($trigger === 'POST:Module:Billing-bill-update') {
// is receiver update -> change all movements
// is status update -> change all movements (delete = delete)
StockMovementMapper::update()->execute($transaction);
/** @var \Modules\Billing\Models\Bill $new */
if ($new->status === BillStatus::DELETED) {
$this->eventBillUpdateInternal(
$account, $old, $new,
$type, 'POST:Module:Billing-bill-delete', $module, $ref, $content, $ip
);
} elseif ($new->status === BillStatus::ARCHIVED) {
/** @var \Modules\Billing\Models\Bill $bill */
$bill = BillMapper::get()
->with('type')
->with('elements')
->with('supplier')
->with('client')
->where('id', $new->id)
->execute();
foreach ($bill->elements as $element) {
/** @var \Modules\WarehouseManagement\Models\StockTransaction[] $transactions */
$transactions = StockTransactionMapper::getAll()
->where('billElement', $element->id)
->execute();
foreach ($transactions as $transaction) {
$transaction->state = StockTransactionState::TRANSIT; // @todo change to more specific
StockTransactionMapper::update()->execute($transaction);
}
}
}
}
return;
}
}
}

View File

@ -59,6 +59,7 @@ final class LotAttributeValueMapper extends DataMapperFactory
'mapper' => LotAttributeValueL11nMapper::class,
'table' => 'warehousemgmt_attr_value_l11n',
'self' => 'warehousemgmt_attr_value_l11n_value',
'column' => 'content',
'external' => null,
],
];

View File

@ -0,0 +1,46 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\WarehouseManagement\Models
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\WarehouseManagement\Models;
/**
* Null model
*
* @package Modules\WarehouseManagement\Models
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*/
final class NullStockDistribution extends StockDistribution
{
/**
* Constructor
*
* @param int $id Model id
*
* @since 1.0.0
*/
public function __construct(int $id = 0)
{
$this->id = $id;
}
/**
* {@inheritdoc}
*/
public function jsonSerialize() : mixed
{
return ['id' => $this->id];
}
}

View File

@ -14,19 +14,33 @@ declare(strict_types=1);
namespace Modules\WarehouseManagement\Models;
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
/**
* WarehouseManagement mapper class.
* Null model
*
* @package Modules\WarehouseManagement\Models
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*
* @template T of StockMovement
* @extends DataMapperFactory<T>
*/
final class StockMovementMapper extends DataMapperFactory
final class NullStockTransaction extends StockTransaction
{
/**
* Constructor
*
* @param int $id Model id
*
* @since 1.0.0
*/
public function __construct(int $id = 0)
{
$this->id = $id;
}
/**
* {@inheritdoc}
*/
public function jsonSerialize() : mixed
{
return ['id' => $this->id];
}
}

View File

@ -0,0 +1,44 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\Warehousing\Models
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\WarehouseManagement\Models;
/**
* Warehouse class.
*
* @package Modules\Warehousing\Models
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*/
class StockDistribution
{
/**
* ID.
*
* @var int
* @since 1.0.0
*/
public int $id = 0;
public int $quantity = 0;
public int $lot = 0;
public int $item = 0;
public int $stock = 0;
public int $stockType = 0;
}

View File

@ -0,0 +1,70 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\WarehouseManagement\Models
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\WarehouseManagement\Models;
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
/**
* WarehouseManagement mapper class.
*
* @package Modules\WarehouseManagement\Models
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*
* @template T of StockDistribution
* @extends DataMapperFactory<T>
*/
final class StockDistributionMapper extends DataMapperFactory
{
/**
* Columns.
*
* @var array<string, array{name:string, type:string, internal:string, autocomplete?:bool, readonly?:bool, writeonly?:bool, annotations?:array}>
* @since 1.0.0
*/
public const COLUMNS = [
'warehousemgmt_stock_distribution_id' => ['name' => 'warehousemgmt_stock_distribution_id', 'type' => 'int', 'internal' => 'id'],
'warehousemgmt_stock_distribution_item' => ['name' => 'warehousemgmt_stock_distribution_item', 'type' => 'int', 'internal' => 'item'],
'warehousemgmt_stock_distribution_lot' => ['name' => 'warehousemgmt_stock_distribution_lot', 'type' => 'int', 'internal' => 'lot'],
'warehousemgmt_stock_distribution_stock' => ['name' => 'warehousemgmt_stock_distribution_stock', 'type' => 'int', 'internal' => 'stock'],
'warehousemgmt_stock_distribution_stocktype' => ['name' => 'warehousemgmt_stock_distribution_stocktype', 'type' => 'int', 'internal' => 'stockType'],
'warehousemgmt_stock_distribution_quantity' => ['name' => 'warehousemgmt_stock_distribution_quantity', 'type' => 'int', 'internal' => 'quantity'],
];
/**
* Model to use by the mapper.
*
* @var class-string<T>
* @since 1.0.0
*/
public const MODEL = StockDistribution::class;
/**
* Primary table.
*
* @var string
* @since 1.0.0
*/
public const TABLE = 'warehousemgmt_stock_distribution';
/**
* Primary field name.
*
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD = 'warehousemgmt_stock_distribution_id';
}

View File

@ -25,7 +25,7 @@ use Modules\Admin\Models\NullAccount;
* @link https://jingga.app
* @since 1.0.0
*/
class StockMovement
class StockTransaction
{
/**
* ID.
@ -43,7 +43,7 @@ class StockMovement
public int $to = 0;
public int $type = StockMovementType::TRANSFER;
public int $type = StockTransactionType::TRANSFER;
public int $subtype = 0;
@ -51,7 +51,17 @@ class StockMovement
public int $billElement = 0;
public int $state = StockMovementState::DRAFT;
public int $state = StockTransactionState::DRAFT;
public int $item = 0;
public int $fromLot = 0;
public int $fromStock = 0;
public int $fromStockType = 0;
public int $toLot = 0;
public int $toStock = 0;
public int $toStockType = 0;
/**
* Creator.

View File

@ -0,0 +1,76 @@
<?php
/**
* Jingga
*
* PHP Version 8.1
*
* @package Modules\WarehouseManagement\Models
* @copyright Dennis Eichhorn
* @license OMS License 2.0
* @version 1.0.0
* @link https://jingga.app
*/
declare(strict_types=1);
namespace Modules\WarehouseManagement\Models;
use phpOMS\DataStorage\Database\Mapper\DataMapperFactory;
/**
* WarehouseManagement mapper class.
*
* @package Modules\WarehouseManagement\Models
* @license OMS License 2.0
* @link https://jingga.app
* @since 1.0.0
*
* @template T of StockTransaction
* @extends DataMapperFactory<T>
*/
final class StockTransactionMapper extends DataMapperFactory
{
/**
* Columns.
*
* @var array<string, array{name:string, type:string, internal:string, autocomplete?:bool, readonly?:bool, writeonly?:bool, annotations?:array}>
* @since 1.0.0
*/
public const COLUMNS = [
'warehousemgmt_stock_transaction_id' => ['name' => 'warehousemgmt_stock_transaction_id', 'type' => 'int', 'internal' => 'id'],
'warehousemgmt_stock_transaction_state' => ['name' => 'warehousemgmt_stock_transaction_state', 'type' => 'int', 'internal' => 'state'],
'warehousemgmt_stock_transaction_quantity' => ['name' => 'warehousemgmt_stock_transaction_quantity', 'type' => 'int', 'internal' => 'quantity'],
'warehousemgmt_stock_transaction_type' => ['name' => 'warehousemgmt_stock_transaction_type', 'type' => 'int', 'internal' => 'type'],
'warehousemgmt_stock_transaction_item' => ['name' => 'warehousemgmt_stock_transaction_item', 'type' => 'int', 'internal' => 'item'],
'warehousemgmt_stock_transaction_from_lot' => ['name' => 'warehousemgmt_stock_transaction_from_lot', 'type' => 'int', 'internal' => 'fromLot'],
'warehousemgmt_stock_transaction_from_stock' => ['name' => 'warehousemgmt_stock_transaction_from_stock', 'type' => 'int', 'internal' => 'fromStock'],
'warehousemgmt_stock_transaction_from_stocktype' => ['name' => 'warehousemgmt_stock_transaction_from_stocktype', 'type' => 'int', 'internal' => 'fromStockType'],
'warehousemgmt_stock_transaction_to_lot' => ['name' => 'warehousemgmt_stock_transaction_to_lot', 'type' => 'int', 'internal' => 'toLot'],
'warehousemgmt_stock_transaction_to_stock' => ['name' => 'warehousemgmt_stock_transaction_to_stock', 'type' => 'int', 'internal' => 'toStock'],
'warehousemgmt_stock_transaction_to_stocktype' => ['name' => 'warehousemgmt_stock_transaction_to_stocktype', 'type' => 'int', 'internal' => 'toStockType'],
'warehousemgmt_stock_transaction_bill_element' => ['name' => 'warehousemgmt_stock_transaction_bill_element', 'type' => 'int', 'internal' => 'billElement'],
];
/**
* Model to use by the mapper.
*
* @var class-string<T>
* @since 1.0.0
*/
public const MODEL = StockTransaction::class;
/**
* Primary table.
*
* @var string
* @since 1.0.0
*/
public const TABLE = 'warehousemgmt_stock_transaction';
/**
* Primary field name.
*
* @var string
* @since 1.0.0
*/
public const PRIMARYFIELD = 'warehousemgmt_stock_transaction_id';
}

View File

@ -24,7 +24,7 @@ use phpOMS\Stdlib\Base\Enum;
* @link https://jingga.app
* @since 1.0.0
*/
abstract class StockMovementState extends Enum
abstract class StockTransactionState extends Enum
{
public const DRAFT = 1;

View File

@ -24,7 +24,7 @@ use phpOMS\Stdlib\Base\Enum;
* @link https://jingga.app
* @since 1.0.0
*/
abstract class StockMovementType extends Enum
abstract class StockTransactionType extends Enum
{
public const MERGE = 1;

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'الجميع',
'Amount' => 'مقدار',
'Arrivals' => 'الوصول',
'Article' => 'مقالة - سلعة',
'Articles' => 'مقالات',
'City' => 'مدينة',
'Consignee' => 'المرسل إليه',
'Consignor' => 'المرسل',
'Country' => 'دولة',
'Date' => 'تاريخ',
'Description' => 'وصف',
'Interval' => 'فترة',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'موقع',
'Locations' => '',
'Matchcode' => 'رمز مطابق',
'Month' => 'شهر',
'Name' => 'اسم',
'Order' => 'طلب',
'Quantity' => 'كمية',
'Reference' => 'المرجعي',
'Shipping' => 'شحن',
'Statistics' => 'إحصائيات',
'Stock' => 'المخزون',
'Stocks' => '',
'Street' => 'شارع',
'Today' => 'اليوم',
'Type' => 'نوع',
'Types' => '',
'Week' => 'أسبوع',
'Year' => 'عام',
'Zip' => 'أزيز',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Všechno',
'Amount' => 'Množství',
'Arrivals' => 'Přílety',
'Article' => 'Článek',
'Articles' => 'Články',
'City' => 'Město',
'Consignee' => 'Příjemce',
'Consignor' => 'Odesílatel',
'Country' => 'Země',
'Date' => 'datum',
'Description' => 'Popis',
'Interval' => 'Interval',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Umístění',
'Locations' => '',
'Matchcode' => 'MatchCode.',
'Month' => 'Měsíc',
'Name' => 'název',
'Order' => 'Objednat',
'Quantity' => 'Množství',
'Reference' => 'Odkaz',
'Shipping' => 'Lodní doprava',
'Statistics' => 'Statistika',
'Stock' => 'Skladem',
'Stocks' => '',
'Street' => 'ulice',
'Today' => 'Dnes',
'Type' => 'Typ',
'Types' => '',
'Week' => 'Týden',
'Year' => 'Rok',
'Zip' => 'Zip',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Alle',
'Amount' => 'Beløb',
'Arrivals' => 'Ankomster.',
'Article' => 'Artikel',
'Articles' => 'Artikler',
'City' => 'City.',
'Consignee' => 'Modtageren.',
'Consignor' => 'Afsender.',
'Country' => 'Land',
'Date' => 'Dato',
'Description' => 'Beskrivelse',
'Interval' => 'Interval',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Beliggenhed',
'Locations' => '',
'Matchcode' => 'MatchCode.',
'Month' => 'Måned',
'Name' => 'Navn',
'Order' => 'Bestille',
'Quantity' => 'Antal',
'Reference' => 'Reference',
'Shipping' => 'Forsendelse',
'Statistics' => 'Statistikker',
'Stock' => 'Lager',
'Stocks' => '',
'Street' => 'Gade',
'Today' => 'I dag',
'Type' => 'Type',
'Types' => '',
'Week' => 'Uge',
'Year' => 'År',
'Zip' => 'Zip.',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Alle',
'Amount' => 'Höhe',
'Arrivals' => 'Ankunft',
'Article' => 'Artikel',
'Articles' => 'Artikel',
'City' => 'Stadt',
'Consignee' => 'Empfänger',
'Consignor' => 'Versender',
'Country' => 'Land',
'Date' => 'Datum',
'Description' => 'Beschreibung',
'Interval' => 'Intervall',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Ort',
'Locations' => '',
'Matchcode' => 'Matchcode',
'Month' => 'Monat',
'Name' => 'Name',
'Order' => 'Befehl',
'Quantity' => 'Menge',
'Reference' => 'Bezug',
'Shipping' => 'Versand',
'Statistics' => 'Statistiken',
'Stock' => 'Aktie',
'Stocks' => '',
'Street' => 'Straße',
'Today' => 'Heute',
'Type' => 'Typ',
'Types' => '',
'Week' => 'Woche',
'Year' => 'Jahr',
'Zip' => 'Reißverschluss',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Ολα',
'Amount' => 'Ποσό',
'Arrivals' => 'Αφίξεις',
'Article' => 'Αρθρο',
'Articles' => 'Είδη',
'City' => 'Πόλη',
'Consignee' => 'Παραλήπτης',
'Consignor' => 'Αποστολέας',
'Country' => 'Χώρα',
'Date' => 'Ημερομηνία',
'Description' => 'Περιγραφή',
'Interval' => 'Διάστημα',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Τοποθεσία',
'Locations' => '',
'Matchcode' => 'Matchcode',
'Month' => 'Μήνας',
'Name' => 'Ονομα',
'Order' => 'Σειρά',
'Quantity' => 'Ποσότητα',
'Reference' => 'Αναφορά',
'Shipping' => 'Αποστολή',
'Statistics' => 'Στατιστική',
'Stock' => 'Στοκ',
'Stocks' => '',
'Street' => 'Δρόμος',
'Today' => 'Σήμερα',
'Type' => 'Τύπος',
'Types' => '',
'Week' => 'Εβδομάδα',
'Year' => 'Ετος',
'Zip' => 'Φερμουάρ',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'All',
'Amount' => 'Amount',
'Arrivals' => 'Arrivals',
'Article' => 'Article',
'Articles' => 'Articles',
'City' => 'City',
'Consignee' => 'Consignee',
'Consignor' => 'Consignor',
'Country' => 'Country',
'Date' => 'Date',
'Description' => 'Description',
'Interval' => 'Interval',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Location',
'Locations' => 'Locations',
'Matchcode' => 'Matchcode',
'Month' => 'Month',
'Name' => 'Name',
'Order' => 'Order',
'Quantity' => 'Quantity',
'Reference' => 'Reference',
'Shipping' => 'Shipping',
'Statistics' => 'Statistics',
'Stock' => 'Stock',
'Stocks' => 'Stocks',
'Street' => 'Street',
'Today' => 'Today',
'Type' => 'Type',
'Types' => 'Types',
'Week' => 'Week',
'Year' => 'Year',
'Zip' => 'Zip',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Todo',
'Amount' => 'Monto',
'Arrivals' => 'Llegadas',
'Article' => 'Artículo',
'Articles' => 'Artículos',
'City' => 'Ciudad',
'Consignee' => 'Consignatario',
'Consignor' => 'Consignador',
'Country' => 'País',
'Date' => 'Fecha',
'Description' => 'Descripción',
'Interval' => 'Intervalo',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Ubicación',
'Locations' => '',
'Matchcode' => 'Código de asociación',
'Month' => 'Mes',
'Name' => 'Nombre',
'Order' => 'Pedido',
'Quantity' => 'Cantidad',
'Reference' => 'Referencia',
'Shipping' => 'Transporte',
'Statistics' => 'Estadísticas',
'Stock' => 'Valores',
'Stocks' => '',
'Street' => 'calle',
'Today' => 'Hoy dia',
'Type' => 'Escribe',
'Types' => '',
'Week' => 'Semana',
'Year' => 'Año',
'Zip' => 'Cremallera',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Kaikki',
'Amount' => 'Määrä',
'Arrivals' => 'Saapuvat',
'Article' => 'Artikla',
'Articles' => 'Artikkelit',
'City' => 'Kaupunki',
'Consignee' => 'Vastaanottaja',
'Consignor' => 'Lähettäjä',
'Country' => 'Maa',
'Date' => 'Päivämäärä',
'Description' => 'Kuvaus',
'Interval' => 'Aikaväli',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Sijainti',
'Locations' => '',
'Matchcode' => 'Matchcode',
'Month' => 'Kuukausi',
'Name' => 'Nimi',
'Order' => 'Tilaus',
'Quantity' => 'Määrä',
'Reference' => 'Viite',
'Shipping' => 'laivaus',
'Statistics' => 'Tilastot',
'Stock' => 'Varasto',
'Stocks' => '',
'Street' => 'Katu',
'Today' => 'Tänään',
'Type' => 'Tyyppi',
'Types' => '',
'Week' => 'Viikko',
'Year' => 'Vuosi',
'Zip' => 'Postinumero',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Tout',
'Amount' => 'Quantité',
'Arrivals' => 'Arrivées',
'Article' => 'Article',
'Articles' => 'Des articles',
'City' => 'Ville',
'Consignee' => 'Destinataire',
'Consignor' => 'Expéditeur',
'Country' => 'Pays',
'Date' => 'Date',
'Description' => 'La description',
'Interval' => 'Intervalle',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Emplacement',
'Locations' => '',
'Matchcode' => 'Encadrement',
'Month' => 'Mois',
'Name' => 'Nom',
'Order' => 'Commander',
'Quantity' => 'Quantité',
'Reference' => 'Référence',
'Shipping' => 'Expédition',
'Statistics' => 'Statistiques',
'Stock' => 'Stocker',
'Stocks' => '',
'Street' => 'rue',
'Today' => 'Aujourd\'hui',
'Type' => 'Taper',
'Types' => '',
'Week' => 'La semaine',
'Year' => 'An',
'Zip' => 'Zipper',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Minden',
'Amount' => 'Összeg',
'Arrivals' => 'Érkezés',
'Article' => 'Cikk',
'Articles' => 'Árucikkek',
'City' => 'Város',
'Consignee' => 'Címzett',
'Consignor' => 'Feladó',
'Country' => 'Ország',
'Date' => 'Dátum',
'Description' => 'Leírás',
'Interval' => 'Intervallum',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Elhelyezkedés',
'Locations' => '',
'Matchcode' => 'Matchcode',
'Month' => 'Hónap',
'Name' => 'Név',
'Order' => 'Rendelés',
'Quantity' => 'Mennyiség',
'Reference' => 'Referencia',
'Shipping' => 'Szállítás',
'Statistics' => 'Statisztika',
'Stock' => 'Készlet',
'Stocks' => '',
'Street' => 'utca',
'Today' => 'Ma',
'Type' => 'típus',
'Types' => '',
'Week' => 'Hét',
'Year' => 'Év',
'Zip' => 'Postai irányítószám',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Tutto',
'Amount' => 'Quantità',
'Arrivals' => 'Arrivi',
'Article' => 'Articolo',
'Articles' => 'Artificio',
'City' => 'Città',
'Consignee' => 'Destinatario',
'Consignor' => 'Mittente',
'Country' => 'Nazione',
'Date' => 'Data',
'Description' => 'Descrizione',
'Interval' => 'Intervallo',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Posizione',
'Locations' => '',
'Matchcode' => 'Matchcode.',
'Month' => 'Mese',
'Name' => 'Nome',
'Order' => 'Ordine',
'Quantity' => 'Quantità',
'Reference' => 'Riferimento',
'Shipping' => 'Spedizione',
'Statistics' => 'Statistiche',
'Stock' => 'Azione',
'Stocks' => '',
'Street' => 'strada',
'Today' => 'Oggi',
'Type' => 'Tipo',
'Types' => '',
'Week' => 'Settimana',
'Year' => 'Anno',
'Zip' => 'Cerniera lampo',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => '全て',
'Amount' => '額',
'Arrivals' => '到着',
'Article' => '記事',
'Articles' => 'articles',
'City' => '市',
'Consignee' => '荷送人',
'Consignor' => '荷送人',
'Country' => '国',
'Date' => '日にち',
'Description' => '説明',
'Interval' => '間隔',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => '位置',
'Locations' => '',
'Matchcode' => 'マッチコード',
'Month' => '月',
'Name' => '名前',
'Order' => '注文',
'Quantity' => '量',
'Reference' => 'リファレンス',
'Shipping' => '運送',
'Statistics' => '統計学',
'Stock' => 'ストック',
'Stocks' => '',
'Street' => '街',
'Today' => '今日',
'Type' => 'タイプ',
'Types' => '',
'Week' => '週',
'Year' => '年',
'Zip' => 'ジップ',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => '모두',
'Amount' => '양',
'Arrivals' => '도착',
'Article' => '기사',
'Articles' => '조항',
'City' => '도시',
'Consignee' => '수취인',
'Consignor' => '위탁자',
'Country' => '국가',
'Date' => '날짜',
'Description' => '설명',
'Interval' => '간격',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => '위치',
'Locations' => '',
'Matchcode' => '매치 코드',
'Month' => '월',
'Name' => '이름',
'Order' => '주문하다',
'Quantity' => '수량',
'Reference' => '참조',
'Shipping' => '배송',
'Statistics' => '통계',
'Stock' => '재고',
'Stocks' => '',
'Street' => '거리',
'Today' => '오늘',
'Type' => '유형',
'Types' => '',
'Week' => '주',
'Year' => '년도',
'Zip' => '지퍼',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Alle',
'Amount' => 'Beløp',
'Arrivals' => 'Ankomster.',
'Article' => 'Artikkel',
'Articles' => 'Artikler',
'City' => 'By',
'Consignee' => 'Mottaker',
'Consignor' => 'Avsender',
'Country' => 'Land',
'Date' => 'Dato',
'Description' => 'Beskrivelse',
'Interval' => 'Intervall',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'plassering',
'Locations' => '',
'Matchcode' => 'MatchCode.',
'Month' => 'Måned',
'Name' => 'Navn',
'Order' => 'Rekkefølge',
'Quantity' => 'Mengde',
'Reference' => 'Referanse',
'Shipping' => 'Shipping',
'Statistics' => 'Statistikk',
'Stock' => 'Lager',
'Stocks' => '',
'Street' => 'gate',
'Today' => 'I dag',
'Type' => 'Type',
'Types' => '',
'Week' => 'Uke',
'Year' => 'År',
'Zip' => 'Glidelås',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Wszystkie',
'Amount' => 'Kwota',
'Arrivals' => 'Przyloty',
'Article' => 'Artykuł',
'Articles' => 'Artykuły',
'City' => 'Miasto',
'Consignee' => 'Konsygnatariusz',
'Consignor' => 'Wysyłający',
'Country' => 'Kraj',
'Date' => 'Data',
'Description' => 'Opis',
'Interval' => 'Interwał',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Lokalizacja',
'Locations' => '',
'Matchcode' => 'MatchCode.',
'Month' => 'Miesiąc',
'Name' => 'Nazwa',
'Order' => 'Zamówienie',
'Quantity' => 'Ilość',
'Reference' => 'Odniesienie',
'Shipping' => 'Wysyłka',
'Statistics' => 'Statystyka',
'Stock' => 'Magazyn',
'Stocks' => '',
'Street' => 'Ulica',
'Today' => 'Dziś',
'Type' => 'Rodzaj',
'Types' => '',
'Week' => 'Tydzień',
'Year' => 'Rok',
'Zip' => 'Zamek błyskawiczny',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Tudo',
'Amount' => 'Montante',
'Arrivals' => 'Chegadas',
'Article' => 'Artigo',
'Articles' => 'Artigos',
'City' => 'Cidade',
'Consignee' => 'Consignatário',
'Consignor' => 'Expedidor',
'Country' => 'País',
'Date' => 'Encontro',
'Description' => 'Descrição',
'Interval' => 'Intervalo',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Localização',
'Locations' => '',
'Matchcode' => 'Código de combinação',
'Month' => 'Mês',
'Name' => 'Nome',
'Order' => 'Pedido',
'Quantity' => 'Quantidade',
'Reference' => 'Referência',
'Shipping' => 'Envio',
'Statistics' => 'Estatisticas',
'Stock' => 'Estoque',
'Stocks' => '',
'Street' => 'rua',
'Today' => 'Hoje',
'Type' => 'Modelo',
'Types' => '',
'Week' => 'Semana',
'Year' => 'Ano',
'Zip' => 'Fecho eclair',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Все',
'Amount' => 'Количество',
'Arrivals' => 'Прибытие',
'Article' => 'Статья',
'Articles' => 'Статьи',
'City' => 'Город',
'Consignee' => 'Грузополучатель',
'Consignor' => 'Грузоподъемность',
'Country' => 'Страна',
'Date' => 'Дата',
'Description' => 'Описание',
'Interval' => 'Интервал',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Место расположения',
'Locations' => '',
'Matchcode' => 'MatchCode.',
'Month' => 'Месяц',
'Name' => 'Имя',
'Order' => 'Заказ',
'Quantity' => 'Количество',
'Reference' => 'Ссылка',
'Shipping' => 'Перевозки',
'Statistics' => 'Статистика',
'Stock' => 'Склад',
'Stocks' => '',
'Street' => 'улица',
'Today' => 'Сегодня',
'Type' => 'Тип',
'Types' => '',
'Week' => 'Неделю',
'Year' => 'Год',
'Zip' => 'Zip.',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Allt',
'Amount' => 'Belopp',
'Arrivals' => 'ankomster',
'Article' => 'Artikel',
'Articles' => 'Artiklar',
'City' => 'Stad',
'Consignee' => 'Mottagare',
'Consignor' => 'Avsändare',
'Country' => 'Land',
'Date' => 'Datum',
'Description' => 'Beskrivning',
'Interval' => 'Intervall',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Plats',
'Locations' => '',
'Matchcode' => 'Matchcode',
'Month' => 'Månad',
'Name' => 'namn',
'Order' => 'Beställa',
'Quantity' => 'Kvantitet',
'Reference' => 'Referens',
'Shipping' => 'Frakt',
'Statistics' => 'Statistik',
'Stock' => 'Stock',
'Stocks' => '',
'Street' => 'Gata',
'Today' => 'I dag',
'Type' => 'Typ',
'Types' => '',
'Week' => 'Vecka',
'Year' => 'År',
'Zip' => 'Blixtlås',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'ทั้งหมด',
'Amount' => 'จำนวน',
'Arrivals' => 'ขาเข้า',
'Article' => 'บทความ',
'Articles' => 'บทความ',
'City' => 'เมือง',
'Consignee' => 'ผู้รับ',
'Consignor' => 'ผู้ตราส่ง',
'Country' => 'ประเทศ',
'Date' => 'วันที่',
'Description' => 'คำอธิบาย',
'Interval' => 'ช่วงเวลา',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'ที่ตั้ง',
'Locations' => '',
'Matchcode' => 'การจับคู่',
'Month' => 'เดือน',
'Name' => 'ชื่อ',
'Order' => 'คำสั่ง',
'Quantity' => 'ปริมาณ',
'Reference' => 'อ้างอิง',
'Shipping' => 'การส่งสินค้า',
'Statistics' => 'สถิติ',
'Stock' => 'คลังสินค้า',
'Stocks' => '',
'Street' => 'ถนน',
'Today' => 'วันนี้',
'Type' => 'พิมพ์',
'Types' => '',
'Week' => 'สัปดาห์',
'Year' => 'ปี',
'Zip' => 'ซิป',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Herşey',
'Amount' => 'Miktar',
'Arrivals' => 'Geliş',
'Article' => 'Madde',
'Articles' => 'Nesne',
'City' => 'Şehir',
'Consignee' => 'Alıcı',
'Consignor' => 'Gönderici',
'Country' => 'Ülke',
'Date' => 'Tarih',
'Description' => 'Açıklama',
'Interval' => 'Aralık',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Konum',
'Locations' => '',
'Matchcode' => 'Maç Kodu',
'Month' => 'Ay',
'Name' => 'İsim',
'Order' => 'Emir',
'Quantity' => 'Miktar',
'Reference' => 'Referans',
'Shipping' => 'Nakliye',
'Statistics' => 'İstatistik',
'Stock' => 'Stoklamak',
'Stocks' => '',
'Street' => 'sokak',
'Today' => 'Bugün',
'Type' => 'Tip',
'Types' => '',
'Week' => 'Hafta',
'Year' => 'Yıl',
'Zip' => 'Zip',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => 'Все',
'Amount' => 'Сума',
'Arrivals' => 'Прибуття',
'Article' => 'Стаття',
'Articles' => 'Статті',
'City' => 'Місто',
'Consignee' => 'Вантажоодержувач',
'Consignor' => 'Вантажовідправність',
'Country' => 'Країна',
'Date' => 'Дата',
'Description' => 'Опис',
'Interval' => 'Інтервал',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => 'Місцезнаходження',
'Locations' => '',
'Matchcode' => 'Матч',
'Month' => 'Місяць',
'Name' => 'Назва',
'Order' => 'Порядок',
'Quantity' => 'Кількість',
'Reference' => 'Довідник',
'Shipping' => 'Доставка',
'Statistics' => 'Статистика',
'Stock' => 'Запас',
'Stocks' => '',
'Street' => 'Вулиця',
'Today' => 'Сьогодні',
'Type' => 'Тип',
'Types' => '',
'Week' => 'Тиждень',
'Year' => 'Рік',
'Zip' => 'Блиск',
]];

View File

@ -13,38 +13,12 @@
declare(strict_types=1);
return ['WarehouseManagement' => [
'All' => '全部',
'Amount' => '数量',
'Arrivals' => '到达',
'Article' => '文章',
'Articles' => '文章',
'City' => '城市',
'Consignee' => '收货人',
'Consignor' => '托运人',
'Country' => '国家',
'Date' => '日期',
'Description' => '描述',
'Interval' => '间隔',
'Language' => '',
'Localization' => '',
'Localizations' => '',
'Location' => '地点',
'Locations' => '',
'Matchcode' => '匹配码',
'Month' => '月',
'Name' => '名称',
'Order' => '命令',
'Quantity' => '数量',
'Reference' => '参考',
'Shipping' => '船运',
'Statistics' => '统计数据',
'Stock' => '库存',
'Stocks' => '',
'Street' => '街道',
'Today' => '今天',
'Type' => '类型',
'Types' => '',
'Week' => '星期',
'Year' => '年',
'Zip' => '压缩',
]];

View File

@ -14,25 +14,25 @@ declare(strict_types=1);
namespace Modules\WarehouseManagement\tests\Models;
use Modules\WarehouseManagement\Models\StockMovement;
use Modules\WarehouseManagement\Models\StockTransaction;
/**
* @internal
*/
final class StockMovementTest extends \PHPUnit\Framework\TestCase
final class StockTransactionTest extends \PHPUnit\Framework\TestCase
{
private StockMovement $movement;
private StockTransaction $movement;
/**
* {@inheritdoc}
*/
protected function setUp() : void
{
$this->movement = new StockMovement();
$this->movement = new StockTransaction();
}
/**
* @covers Modules\WarehouseManagement\Models\StockMovement
* @covers Modules\WarehouseManagement\Models\StockTransaction
* @group module
*/
public function testDefault() : void