Allow to set if prices contain VAT or not in orderdetail

This commit is contained in:
Jan Böhmer 2026-02-08 21:54:34 +01:00
parent f95e39748e
commit 3bff5fa8bd
8 changed files with 159 additions and 21 deletions

View file

@ -52,6 +52,7 @@ use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\SerializedName;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Length;
@ -388,6 +389,50 @@ class Orderdetail extends AbstractDBElement implements TimeStampableInterface, N
return $this;
}
/**
* Checks if the prices of this orderdetail include VAT. This is determined by checking the pricedetails of this
* orderdetail. If there are no pricedetails or if the pricedetails have conflicting values, null is returned.
* @return bool|null
*/
#[Groups(['orderdetail:read'])]
#[SerializedName('prices_include_vat')]
public function getPricesIncludesVAT(): ?bool
{
$value = null;
//We determine that via the pricedetails
foreach ($this->getPricedetails() as $pricedetail) {
/** @var Pricedetail $pricedetail */
if ($pricedetail->getIncludesVat() === null) {
return null; // If any pricedetail doesn't specify this, we can't determine it
}
if ($value === null) {
$value = $pricedetail->getIncludesVat(); // Set initial value
} elseif ($value !== $pricedetail->getIncludesVat()) {
return null; // If there are conflicting values, we can't determine it
}
}
return $value;
}
/**
* Sets whether the prices of this orderdetail include VAT. This is set for all pricedetails of this orderdetail.
* @param bool|null $includesVat
* @return $this
*/
#[Groups(['orderdetail:write'])]
#[SerializedName('prices_include_vat')]
public function setPricesIncludesVAT(?bool $includesVat): self
{
foreach ($this->getPricedetails() as $pricedetail) {
/** @var Pricedetail $pricedetail */
$pricedetail->setIncludesVat($includesVat);
}
return $this;
}
public function getName(): string
{
return $this->getSupplierPartNr();

View file

@ -124,9 +124,9 @@ class Pricedetail extends AbstractDBElement implements TimeStampableInterface
/**
* @var bool|null Whether the price includes VAT or not. Null means, that it is not specified, if the price includes VAT or not.
*/
#[ORM\Column(type: Types::BOOLEAN, nullable: true)]
#[ORM\Column(name: "include_vat", type: Types::BOOLEAN, nullable: true)]
#[Groups(['extended', 'full', 'import', 'pricedetail:read', 'pricedetail:write'])]
protected ?bool $include_vat = null;
protected ?bool $includes_vat = null;
public function __construct()
{
@ -271,6 +271,15 @@ class Pricedetail extends AbstractDBElement implements TimeStampableInterface
return $this->currency?->getIsoCode();
}
/**
* Returns whether the price includes VAT or not. Null means, that it is not specified, if the price includes VAT or not.
* @return bool|null
*/
public function getIncludesVat(): ?bool
{
return $this->includes_vat;
}
/********************************************************************************
*
* Setters
@ -369,24 +378,13 @@ class Pricedetail extends AbstractDBElement implements TimeStampableInterface
}
/**
* Returns whether the price includes VAT or not. Null means, that it is not specified, if the price includes VAT or not.
* @return bool|null
*/
public function getIncludeVat(): ?bool
{
return $this->include_vat;
}
/**
* Sets whether the price includes VAT or not. Null means, that it is not specified, if the price includes VAT or not.
* @param bool|null $include_vat
* Set whether the price includes VAT or not. Null means, that it is not specified, if the price includes VAT or not.
* @param bool|null $includes_vat
* @return $this
*/
public function setIncludeVat(?bool $include_vat): self
public function setIncludesVat(?bool $includes_vat): self
{
$this->include_vat = $include_vat;
$this->includes_vat = $includes_vat;
return $this;
}
}

View file

@ -22,6 +22,7 @@ declare(strict_types=1);
namespace App\Form\Part;
use App\Form\Type\TriStateCheckboxType;
use Symfony\Bundle\SecurityBundle\Security;
use App\Entity\Parts\MeasurementUnit;
use App\Entity\Parts\Supplier;
@ -73,6 +74,11 @@ class OrderdetailType extends AbstractType
'label' => 'orderdetails.edit.obsolete',
]);
$builder->add('pricesIncludesVAT', TriStateCheckboxType::class, [
'required' => false,
'label' => 'orderdetails.edit.prices_includes_vat',
]);
//Add pricedetails after we know the data, so we can set the default currency
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($options): void {
/** @var Orderdetail $orderdetail */