mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2025-06-21 09:35:49 +02:00
Respect different currencies for pricedetails when importing from PartKeepr
This commit is contained in:
parent
1e515df0b5
commit
ac6dd23fd6
1 changed files with 49 additions and 3 deletions
|
@ -30,10 +30,12 @@ use App\Entity\Parts\Part;
|
||||||
use App\Entity\Parts\PartLot;
|
use App\Entity\Parts\PartLot;
|
||||||
use App\Entity\Parts\Storelocation;
|
use App\Entity\Parts\Storelocation;
|
||||||
use App\Entity\Parts\Supplier;
|
use App\Entity\Parts\Supplier;
|
||||||
|
use App\Entity\PriceInformations\Currency;
|
||||||
use App\Entity\PriceInformations\Orderdetail;
|
use App\Entity\PriceInformations\Orderdetail;
|
||||||
use App\Entity\PriceInformations\Pricedetail;
|
use App\Entity\PriceInformations\Pricedetail;
|
||||||
use Brick\Math\BigDecimal;
|
use Brick\Math\BigDecimal;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Symfony\Component\Intl\Currencies;
|
||||||
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
|
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,10 +45,13 @@ class PKPartImporter
|
||||||
{
|
{
|
||||||
use PKImportHelperTrait;
|
use PKImportHelperTrait;
|
||||||
|
|
||||||
public function __construct(EntityManagerInterface $em, PropertyAccessorInterface $propertyAccessor)
|
private string $base_currency;
|
||||||
|
|
||||||
|
public function __construct(EntityManagerInterface $em, PropertyAccessorInterface $propertyAccessor, string $default_currency)
|
||||||
{
|
{
|
||||||
$this->em = $em;
|
$this->em = $em;
|
||||||
$this->propertyAccessor = $propertyAccessor;
|
$this->propertyAccessor = $propertyAccessor;
|
||||||
|
$this->base_currency = $default_currency;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function importParts(array $data): int
|
public function importParts(array $data): int
|
||||||
|
@ -195,6 +200,37 @@ class PKPartImporter
|
||||||
$this->em->flush();
|
$this->em->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the currency for the given ISO code. If the currency does not exist, it is created.
|
||||||
|
* This function returns null if the ISO code is the base currency.
|
||||||
|
* @param string $currency_iso_code
|
||||||
|
* @return Currency|null
|
||||||
|
*/
|
||||||
|
protected function getOrCreateCurrency(string $currency_iso_code): ?Currency
|
||||||
|
{
|
||||||
|
//Normalize ISO code
|
||||||
|
$currency_iso_code = strtoupper($currency_iso_code);
|
||||||
|
|
||||||
|
//We do not have a currency for the base currency to be consistent with prices without currencies
|
||||||
|
if ($currency_iso_code === $this->base_currency) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$currency = $this->em->getRepository(Currency::class)->findOneBy([
|
||||||
|
'iso_code' => $currency_iso_code,
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!$currency) {
|
||||||
|
$currency = new Currency();
|
||||||
|
$currency->setIsoCode($currency_iso_code);
|
||||||
|
$currency->setName(Currencies::getName($currency_iso_code));
|
||||||
|
$this->em->persist($currency);
|
||||||
|
$this->em->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $currency;
|
||||||
|
}
|
||||||
|
|
||||||
protected function importOrderdetails(array $data): void
|
protected function importOrderdetails(array $data): void
|
||||||
{
|
{
|
||||||
if (!isset($data['partdistributor'])) {
|
if (!isset($data['partdistributor'])) {
|
||||||
|
@ -245,8 +281,18 @@ class PKPartImporter
|
||||||
$orderdetail->addPricedetail($pricedetail);
|
$orderdetail->addPricedetail($pricedetail);
|
||||||
//Partkeepr stores the price per item, we need to convert it to the price per packaging unit
|
//Partkeepr stores the price per item, we need to convert it to the price per packaging unit
|
||||||
$price_per_item = BigDecimal::of($partdistributor['price']);
|
$price_per_item = BigDecimal::of($partdistributor['price']);
|
||||||
$pricedetail->setPrice($price_per_item->multipliedBy($partdistributor['packagingUnit']));
|
$packaging_unit = $partdistributor['packagingUnit'] ?? 1;
|
||||||
$pricedetail->setPriceRelatedQuantity($partdistributor['packagingUnit'] ?? 1);
|
$pricedetail->setPrice($price_per_item->multipliedBy($packaging_unit));
|
||||||
|
$pricedetail->setPriceRelatedQuantity($packaging_unit);
|
||||||
|
//We have to set the minimum discount quantity to the packaging unit (PartKeepr does not know this concept)
|
||||||
|
//But in Part-DB the minimum discount qty have to be unique across a orderdetail
|
||||||
|
$pricedetail->setMinDiscountQuantity($packaging_unit);
|
||||||
|
|
||||||
|
//Set the currency of the price
|
||||||
|
if (!empty($partdistributor['currency'])) {
|
||||||
|
$currency = $this->getOrCreateCurrency($partdistributor['currency']);
|
||||||
|
$pricedetail->setCurrency($currency);
|
||||||
|
}
|
||||||
|
|
||||||
$this->em->persist($pricedetail);
|
$this->em->persist($pricedetail);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue