diff --git a/.gitignore b/.gitignore index af27364..7a46ad2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /.idea /composer.lock /node_modules/ -/vendor/ \ No newline at end of file +/vendor/ +/.phpunit.result.cache diff --git a/composer.json b/composer.json index 031e326..0a2db55 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ } ], "require": { - "php": ">=7.2", + "php": ">=7.4", "ext-json": "*", "ext-mbstring": "*", "guzzlehttp/guzzle": "^6.4|^7.0", diff --git a/src/Connector/V2/BoekingConnector.php b/src/Connector/V2/BoekingConnector.php index 4efd131..268323f 100644 --- a/src/Connector/V2/BoekingConnector.php +++ b/src/Connector/V2/BoekingConnector.php @@ -118,7 +118,7 @@ public function findVerkoopboeking(UuidInterface $uuid): ?Model\Verkoopboeking } /** - * @return iterable + * @return Model\Verkoopboeking[]|iterable */ public function findVerkoopfacturen(?ODataRequestDataInterface $ODataRequestData = null, bool $fetchAll = false, iterable $previousResults = null): iterable { @@ -170,4 +170,54 @@ public function addVerkoopboekingDocument(Model\Verkoopboeking $verkoopboeking, return $documentMapper->add($this->connection->doRequest($documentRequest->addVerkoopBoekingDocument($document, $verkoopboeking))); } + + public function findKasboeking(UuidInterface $uuid): ?Model\Kasboeking + { + $boekingRequest = new Request\BoekingRequest(); + $boekingMapper = new Mapper\BoekingMapper(); + + try { + return $boekingMapper->mapKasboeking($this->connection->doRequest($boekingRequest->findKasboeking($uuid))); + } catch (SnelstartResourceNotFoundException $e) { + return null; + } + } + public function addKasboeking(Model\Kasboeking $kasboeking): Model\Kasboeking + { + if ($kasboeking->getId() !== null) { + throw PreValidationException::unexpectedIdException(); + } + + $kasboeking->assertInBalance(); + + $boekingMapper = new Mapper\BoekingMapper(); + $boekingRequest = new Request\BoekingRequest(); + + return $boekingMapper->mapKasboeking($this->connection->doRequest($boekingRequest->addKasboeking($kasboeking))); + } + + public function updateKasboeking(Model\Kasboeking $kasboeking): Model\Kasboeking + { + if ($kasboeking->getId() === null) { + throw PreValidationException::shouldHaveAnIdException(); + } + + $kasboeking->assertInBalance(); + + $boekingMapper = new Mapper\BoekingMapper(); + $boekingRequest = new Request\BoekingRequest(); + + return $boekingMapper->mapKasboeking($this->connection->doRequest($boekingRequest->updateKasboeking($kasboeking))); + } + + public function deleteKasboeking(Model\Kasboeking $kasboeking): void + { + if ($kasboeking->getId() === null) { + throw PreValidationException::shouldHaveAnIdException(); + } + + $boekingRequest = new Request\BoekingRequest(); + + $this->connection->doRequest($boekingRequest->deleteKasboeking($kasboeking)); + } } diff --git a/src/Connector/V2/DagboekConnector.php b/src/Connector/V2/DagboekConnector.php new file mode 100644 index 0000000..0463515 --- /dev/null +++ b/src/Connector/V2/DagboekConnector.php @@ -0,0 +1,24 @@ +connection->doRequest($request->findAll()); + + return $mapper->findAll($response); + } +} diff --git a/src/Mapper/AbstractMapper.php b/src/Mapper/AbstractMapper.php index 8e77821..a2c419e 100644 --- a/src/Mapper/AbstractMapper.php +++ b/src/Mapper/AbstractMapper.php @@ -47,7 +47,11 @@ protected function mapArrayDataToModel(SnelstartObject $class, array $data = []) return $class; } - protected function getMoney(string $money): Money + /** + * @param float|string $money (don't change to string, it will remove cents) + * @return Money + */ + protected function getMoney($money): Money { return new Money(intval(floatval($money) * 100), Snelstart::getCurrency()); } @@ -105,4 +109,4 @@ protected static function fromResponse(ResponseInterface $response): self { return (new static())->setResponseData($response); } -} \ No newline at end of file +} diff --git a/src/Mapper/V2/BoekingMapper.php b/src/Mapper/V2/BoekingMapper.php index 1af126f..1e50751 100644 --- a/src/Mapper/V2/BoekingMapper.php +++ b/src/Mapper/V2/BoekingMapper.php @@ -79,6 +79,12 @@ public function addVerkoopboeking(ResponseInterface $response): Model\Verkoopboe return $this->mapVerkoopboekingResult(new Model\Verkoopboeking()); } + public function mapKasboeking(ResponseInterface $response): Model\Kasboeking + { + $this->setResponseData($response); + return $this->mapKasboekingResult(new Model\Kasboeking()); + } + protected function mapDocumentResult(array $data = []): Model\Document { $data = empty($data) ? $this->responseData : $data; @@ -92,7 +98,7 @@ protected function mapInkoopboekingResult(Model\Inkoopboeking $inkoopboeking, ar /** * @var Model\Inkoopboeking $inkoopboeking */ - $inkoopboeking = $this->mapBoekingResult($inkoopboeking, $data); + $inkoopboeking = $this->mapKoopboekingResult($inkoopboeking, $data); if (isset($data["leverancier"])) { $inkoopboeking->setLeverancier(Model\Relatie::createFromUUID(Uuid::fromString($data["leverancier"]["id"]))); @@ -101,6 +107,75 @@ protected function mapInkoopboekingResult(Model\Inkoopboeking $inkoopboeking, ar return $inkoopboeking; } + protected function mapInkoopfactuurResult(Model\Inkoopfactuur $inkoopfactuur, array $data = []): Model\Inkoopfactuur + { + $data = empty($data) ? $this->responseData : $data; + + // This maps "id", "uri", "modifiedOn" and "factuurnummer". + $inkoopfactuur = $this->mapArrayDataToModel($inkoopfactuur, $data); + + if (isset($data['relatie'])) { + $inkoopfactuur->setRelatie(Model\Relatie::createFromUUID(Uuid::fromString($data['relatie']['id']))); + } + if (isset($data['inkoopBoeking'])) { + $inkoopfactuur->setInkoopboeking(Model\Inkoopboeking::createFromUUID(Uuid::fromString($data['inkoopBoeking']['id']))); + } + + if (isset($data['factuurDatum'])) { + $inkoopfactuur->setFactuurDatum(new DateTimeImmutable($data['factuurDatum'])); + } + if (isset($data['factuurBedrag'])) { + $inkoopfactuur->setFactuurBedrag($this->getMoney($data['factuurBedrag'])); + } + if (isset($data['openstaandSaldo'])) { + $inkoopfactuur->setOpenstaandSaldo($this->getMoney($data['openstaandSaldo'])); + } + if (isset($data['vervalDatum'])) { + $inkoopfactuur->setVervalDatum(new DateTimeImmutable($data['vervalDatum'])); + } + + return $inkoopfactuur; + } + + protected function mapKasboekingResult(Model\Kasboeking $kasboeking, array $data = []): Model\Kasboeking + { + $data = empty($data) ? $this->responseData : $data; + + $kasboeking = $this->mapArrayDataToModel($kasboeking, $data); + + if (isset($data["modifiedOn"])) { + $kasboeking->setModifiedOn(new \DateTimeImmutable($data["modifiedOn"])); + } + + if (isset($data["datum"])) { + $kasboeking->setDatum(new \DateTimeImmutable($data["datum"])); + } + + if (isset($data["grootboekBoekingsRegels"])) { + $kasboeking->setGrootboekBoekingsRegels(...$this->mapKasboekingregels($data["grootboekBoekingsRegels"])); + } + + if (isset($data["inkoopboekingBoekingsRegels"])) { + $kasboeking->setInkoopboekingBoekingsRegels(...$this->mapKasboekingregels($data["inkoopboekingBoekingsRegels"])); + } + + if (isset($data["verkoopboekingBoekingsRegels"])) { + $kasboeking->setVerkoopboekingBoekingsRegels(...$this->mapKasboekingregels($data["verkoopboekingBoekingsRegels"])); + } + + if (isset($data["btwBoekingsregels"])) { + $kasboeking->setBtwBoekingsregels(...array_map(function(array $btw): Model\BtwBoekingsregel { + return (new Model\BtwBoekingsregel()) + ->setType(new Type\BtwBoekingsregelType($btw["type"])) + ->setTarief(new Type\BtwSoort($btw["tarief"])) + ->setCredit($this->getMoney($btw['credit'])) + ->setDebet($this->getMoney($btw['debet'])); + }, $data["btwBoekingsregels"])); + } + + return $kasboeking; + } + protected function mapVerkoopboekingResult(Model\Verkoopboeking $verkoopboeking, array $data = []): Model\Verkoopboeking { $data = empty($data) ? $this->responseData : $data; @@ -108,7 +183,7 @@ protected function mapVerkoopboekingResult(Model\Verkoopboeking $verkoopboeking, /** * @var Model\Verkoopboeking $verkoopboeking */ - $verkoopboeking = $this->mapBoekingResult($verkoopboeking, $data); + $verkoopboeking = $this->mapKoopboekingResult($verkoopboeking, $data); if (isset($data["klant"])) { $verkoopboeking->setKlant(Model\Relatie::createFromUUID(Uuid::fromString($data["klant"]["id"]))); @@ -139,29 +214,42 @@ protected function mapVerkoopboekingResult(Model\Verkoopboeking $verkoopboeking, return $verkoopboeking; } - protected function mapVerkoopfactuurResult(Model\Verkoopfactuur $verkoopfactuur, array $data = []): Model\Verkoopfactuur - { - $data = empty($data) ? $this->responseData : $data; + /** + * @param Model\Verkoopfactuur $verkoopfactuur + * @param array $data + * + * @return Model\Verkoopfactuur + * @throws \Exception + */ + protected function mapVerkoopfactuurResult(Model\Verkoopfactuur $verkoopfactuur, array $data = []): Model\Verkoopfactuur + { + $data = empty($data) ? $this->responseData : $data; - // This maps "id", "uri", "modifiedOn" and "factuurnummer". - $verkoopfactuur = $this->mapArrayDataToModel($verkoopfactuur, $data); + /** + * @var Model\Verkoopfactuur $verkoopfactuur + */ + $verkoopfactuur = $this->mapArrayDataToModel($verkoopfactuur, $data); // This maps "id", "uri", "modifiedOn" and "factuurnummer". if (isset($data['relatie'])) { $verkoopfactuur->setRelatie(Model\Relatie::createFromUUID(Uuid::fromString($data['relatie']['id']))); } - if (isset($data['verkoopBoeking'])) { - $verkoopfactuur->setVerkoopBoeking(Model\Verkoopboeking::createFromUUID(Uuid::fromString($data['verkoopBoeking']['id']))); + + if (isset($data["verkoopBoeking"])) { + $verkoopfactuur->setVerkoopBoeking(Model\Verkoopboeking::createFromUUID(Uuid::fromString($data["verkoopBoeking"]["id"]))); } if (isset($data['factuurDatum'])) { $verkoopfactuur->setFactuurDatum(new DateTimeImmutable($data['factuurDatum'])); } + if (isset($data['factuurBedrag'])) { $verkoopfactuur->setFactuurBedrag($this->getMoney($data['factuurBedrag'])); } + if (isset($data['openstaandSaldo'])) { $verkoopfactuur->setOpenstaandSaldo($this->getMoney($data['openstaandSaldo'])); } + if (isset($data['vervalDatum'])) { $verkoopfactuur->setVervalDatum(new DateTimeImmutable($data['vervalDatum'])); } @@ -169,42 +257,12 @@ protected function mapVerkoopfactuurResult(Model\Verkoopfactuur $verkoopfactuur, return $verkoopfactuur; } - protected function mapInkoopfactuurResult(Model\Inkoopfactuur $inkoopfactuur, array $data = []): Model\Inkoopfactuur - { - $data = empty($data) ? $this->responseData : $data; - - // This maps "id", "uri", "modifiedOn" and "factuurnummer". - $inkoopfactuur = $this->mapArrayDataToModel($inkoopfactuur, $data); - - if (isset($data['relatie'])) { - $inkoopfactuur->setRelatie(Model\Relatie::createFromUUID(Uuid::fromString($data['relatie']['id']))); - } - if (isset($data['inkoopBoeking'])) { - $inkoopfactuur->setInkoopboeking(Model\Inkoopboeking::createFromUUID(Uuid::fromString($data['inkoopBoeking']['id']))); - } - - if (isset($data['factuurDatum'])) { - $inkoopfactuur->setFactuurDatum(new DateTimeImmutable($data['factuurDatum'])); - } - if (isset($data['factuurBedrag'])) { - $inkoopfactuur->setFactuurBedrag($this->getMoney($data['factuurBedrag'])); - } - if (isset($data['openstaandSaldo'])) { - $inkoopfactuur->setOpenstaandSaldo($this->getMoney($data['openstaandSaldo'])); - } - if (isset($data['vervalDatum'])) { - $inkoopfactuur->setVervalDatum(new DateTimeImmutable($data['vervalDatum'])); - } - - return $inkoopfactuur; - } - - protected function mapBoekingResult(Model\Boeking $boeking, array $data = []): Model\Boeking + protected function mapKoopboekingResult(Model\Koopboeking $boeking, array $data = []): Model\Boeking { $data = empty($data) ? $this->responseData : $data; /** - * @var Model\Boeking $boeking + * @var Model\Koopboeking $boeking */ $boeking = $this->mapArrayDataToModel($boeking, $data); @@ -273,13 +331,40 @@ public function mapManyResultsToSubMappers(string $className): \Generator foreach ($this->responseData as $boekingData) { if ($className === Model\Inkoopboeking::class) { yield $this->mapInkoopboekingResult(new $className, $boekingData); - } else if ($className === Model\Verkoopboeking::class) { - yield $this->mapVerkoopboekingResult(new $className, $boekingData); } else if ($className === Model\Verkoopfactuur::class) { - yield $this->mapVerkoopfactuurResult(new $className, $boekingData); + yield $this->mapVerkoopfactuurResult(new $className, $boekingData); + } else if ($className === Model\Verkoopboeking::class) { + yield $this->mapVerkoopboekingResult(new $className, $boekingData); } else if ($className === Model\Inkoopfactuur::class) { yield $this->mapInkoopfactuurResult(new $className, $boekingData); + } else if ($className === Model\Kasboeking::class) { + yield $this->mapKasboekingResult(new $className, $boekingData); } } } + + protected function mapKasboekingregels(array $boekingsregels): array + { + return array_map(function (array $boekingsregel): Model\KasBoekingsregel { + $boekingsregelObject = (new Model\KasBoekingsregel()) + ->setOmschrijving($boekingsregel["omschrijving"]) + ->setCredit($this->getMoney($boekingsregel["credit"])) + ->setDebet($this->getMoney($boekingsregel["debet"])); + + if (isset($boekingsregel["grootboek"])) { + $boekingsregelObject + ->setGrootboek( + Model\Grootboek::createFromUUID(Uuid::fromString($boekingsregel["grootboek"]["id"])) + ); + } + + if (isset($boekingsregel["kostenplaats"])) { + $boekingsregelObject->setKostenplaats( + Kostenplaats::createFromUUID(Uuid::fromString($boekingsregel["kostenplaats"]["id"])) + ); + } + + return $boekingsregelObject; + }, $boekingsregels); + } } diff --git a/src/Mapper/V2/DagboekenMapper.php b/src/Mapper/V2/DagboekenMapper.php new file mode 100644 index 0000000..50302c7 --- /dev/null +++ b/src/Mapper/V2/DagboekenMapper.php @@ -0,0 +1,33 @@ +setResponseData($response); + + foreach ($this->responseData as $data) { + yield $this->mapResultToModel($data); + } + } + + protected function mapResultToModel($data): Model\Dagboek + { + return (new Model\Dagboek()) + ->setId(Uuid::fromString($data["id"])) + ->setUri($data['uri']) + ->setSoort(new Type\DagboekSoort($data["soort"])) + ->setNummer($data['nummer']) + ->setOmschrijving($data["omschrijving"]) + ->setNonactief($data["nonactief"]) + ; + } +} diff --git a/src/Model/Type/BtwBoekingsregelType.php b/src/Model/Type/BtwBoekingsregelType.php new file mode 100644 index 0000000..e4fe9d5 --- /dev/null +++ b/src/Model/Type/BtwBoekingsregelType.php @@ -0,0 +1,16 @@ +isZero()) { - throw new BookingNotInBalanceException(); + throw new BookingNotInBalanceException('Boeking not in balance'); } } -} \ No newline at end of file +} diff --git a/src/Model/V2/Boeking.php b/src/Model/V2/Boeking.php index 3b87905..1320324 100644 --- a/src/Model/V2/Boeking.php +++ b/src/Model/V2/Boeking.php @@ -6,8 +6,6 @@ namespace SnelstartPHP\Model\V2; -use Money\Money; -use SnelstartPHP\Exception\BookingNotInBalanceException; use SnelstartPHP\Model\SnelstartObject; abstract class Boeking extends SnelstartObject @@ -40,26 +38,6 @@ abstract class Boeking extends SnelstartObject */ protected $markering = false; - /** - * De datum van de factuur, dit is ook de datum waarop de boeking wordt geboekt. - * - * @var \DateTimeInterface|null - */ - protected $factuurDatum; - - /** - * Het tijdstip waarop de factuur is of zal vervallen - * - * @var \DateTimeInterface|null - */ - protected $vervalDatum; - - /** - * De factuurnummer van de boeking. - * - * @var string - */ - protected $factuurnummer; /** * De omschrijving van de boeking. @@ -68,10 +46,6 @@ abstract class Boeking extends SnelstartObject */ protected $omschrijving; - /** - * @var Money - */ - protected $factuurbedrag; /** * De omzetregels van de boeking. De btw-bedragen staan hier niet in, @@ -103,14 +77,7 @@ abstract class Boeking extends SnelstartObject "boekstuk", "gewijzigdDoorAccountant", "markering", - "factuurDatum", - "factuurnummer", "omschrijving", - "factuurBedrag", - "boekingsregels", - "vervalDatum", - "btw", - "documents", ]; public function getModifiedOn(): ?\DateTimeInterface @@ -161,42 +128,6 @@ public function setMarkering(bool $markering): self return $this; } - public function getFactuurdatum(): ?\DateTimeInterface - { - return $this->factuurDatum; - } - - public function setFactuurdatum(?\DateTimeInterface $factuurDatum): self - { - $this->factuurDatum = $factuurDatum; - - return $this; - } - - public function getVervaldatum(): ?\DateTimeInterface - { - return $this->vervalDatum; - } - - public function setVervaldatum(?\DateTimeInterface $vervalDatum): self - { - $this->vervalDatum = $vervalDatum; - - return $this; - } - - public function getFactuurnummer(): string - { - return $this->factuurnummer; - } - - public function setFactuurnummer(string $factuurnummer): self - { - $this->factuurnummer = $factuurnummer; - - return $this; - } - public function getOmschrijving(): ?string { return $this->omschrijving; @@ -209,51 +140,4 @@ public function setOmschrijving(?string $omschrijving): self return $this; } - public function getFactuurbedrag(): Money - { - return $this->factuurbedrag; - } - - public function setFactuurbedrag(Money $factuurbedrag): self - { - $this->factuurbedrag = $factuurbedrag; - - return $this; - } - - public function getBoekingsregels(): array - { - return $this->boekingsregels; - } - - public function setBoekingsregels(Boekingsregel ...$boekingsregels): self - { - $this->boekingsregels = $boekingsregels; - - return $this; - } - - public function getBtw(): array - { - return $this->btw ?? []; - } - - public function setBtw(Btwregel ...$btw): self - { - $this->btw = $btw; - - return $this; - } - - public function getDocuments(): array - { - return $this->documents; - } - - public function addDocument(Document $document): self - { - $this->documents[] = $document; - - return $this; - } } diff --git a/src/Model/V2/BtwBoekingsregel.php b/src/Model/V2/BtwBoekingsregel.php new file mode 100644 index 0000000..26070ae --- /dev/null +++ b/src/Model/V2/BtwBoekingsregel.php @@ -0,0 +1,112 @@ +tarief; + } + + /** + * @param BtwSoort $tarief + * @return BtwBoekingsregel + */ + public function setTarief(BtwSoort $tarief): BtwBoekingsregel + { + $this->tarief = $tarief; + return $this; + } + + /** + * @return BtwBoekingsregelType + */ + public function getType(): ?BtwBoekingsregelType + { + return $this->type; + } + + /** + * @param BtwBoekingsregelType $type + * @return BtwBoekingsregel + */ + public function setType(BtwBoekingsregelType $type): BtwBoekingsregel + { + $this->type = $type; + return $this; + } + + /** + * @return Money + */ + public function getDebet(): Money + { + return $this->debet; + } + + /** + * @param Money $debet + * @return BtwBoekingsregel + */ + public function setDebet(Money $debet): BtwBoekingsregel + { + $this->debet = $debet; + return $this; + } + + /** + * @return Money + */ + public function getCredit(): Money + { + return $this->credit; + } + + /** + * @param Money $credit + * @return BtwBoekingsregel + */ + public function setCredit(Money $credit): BtwBoekingsregel + { + $this->credit = $credit; + return $this; + } + +} diff --git a/src/Model/V2/Dagboek.php b/src/Model/V2/Dagboek.php new file mode 100644 index 0000000..d1ec4f8 --- /dev/null +++ b/src/Model/V2/Dagboek.php @@ -0,0 +1,109 @@ +omschrijving; + } + + /** + * @param string $omschrijving + * @return Dagboek + */ + public function setOmschrijving(string $omschrijving): Dagboek + { + $this->omschrijving = $omschrijving; + return $this; + } + + /** + * @return DagboekSoort + */ + public function getSoort(): DagboekSoort + { + return $this->soort; + } + + /** + * @param DagboekSoort $soort + * @return Dagboek + */ + public function setSoort(DagboekSoort $soort): Dagboek + { + $this->soort = $soort; + return $this; + } + + /** + * @return bool + */ + public function isNonactief(): bool + { + return $this->nonactief; + } + + /** + * @param bool $nonactief + * @return Dagboek + */ + public function setNonactief(bool $nonactief): Dagboek + { + $this->nonactief = $nonactief; + return $this; + } + + /** + * @return int + */ + public function getNummer(): int + { + return $this->nummer; + } + + /** + * @param int $nummer + * @return Dagboek + */ + public function setNummer(int $nummer): Dagboek + { + $this->nummer = $nummer; + return $this; + } + + +} diff --git a/src/Model/V2/Inkoopboeking.php b/src/Model/V2/Inkoopboeking.php index 9421109..e40c068 100644 --- a/src/Model/V2/Inkoopboeking.php +++ b/src/Model/V2/Inkoopboeking.php @@ -6,7 +6,7 @@ namespace SnelstartPHP\Model\V2; -final class Inkoopboeking extends Boeking +final class Inkoopboeking extends Koopboeking { /** * De leverancier/crediteur van wie de factuur afkomstig is. @@ -40,4 +40,4 @@ public function setLeverancier(Relatie $leverancier): self return $this; } -} \ No newline at end of file +} diff --git a/src/Model/V2/KasBoekingsregel.php b/src/Model/V2/KasBoekingsregel.php new file mode 100644 index 0000000..aec7b38 --- /dev/null +++ b/src/Model/V2/KasBoekingsregel.php @@ -0,0 +1,208 @@ +omschrijving; + } + + /** + * @param string $omschrijving + * + * @return self + */ + public function setOmschrijving(string $omschrijving): self + { + $this->omschrijving = $omschrijving; + + return $this; + } + + /** + * @return Grootboek + */ + public function getGrootboek(): ?Grootboek + { + return $this->grootboek; + } + + /** + * @param Grootboek $grootboek + * + * @return self + */ + public function setGrootboek(Grootboek $grootboek): self + { + $this->grootboek = $grootboek; + + return $this; + } + + /** + * @return Kostenplaats + */ + public function getKostenplaats(): ?Kostenplaats + { + return $this->kostenplaats; + } + + /** + * @param Kostenplaats $kostenplaats + * + * @return self + */ + public function setKostenplaats(Kostenplaats $kostenplaats): self + { + $this->kostenplaats = $kostenplaats; + + return $this; + } + + /** + * @param Boeking $boekingId + * @return Boeking + */ + public function getBoekingId(): ?Boeking + { + return $this->boekingId; + } + + /** + * @param Boeking $boeking + * + * @return self + */ + public function setBoekingId(Boeking $boeking): self + { + $this->boekingId = $boeking; + + return $this; + } + + /** + * @return BtwSoort + */ + public function getBtwSoort(): ?BtwSoort + { + return $this->btwSoort; + } + + /** + * @param BtwSoort $btwSoort + * + * @return self + */ + public function setBtwSoort(BtwSoort $btwSoort): self + { + $this->btwSoort = $btwSoort; + + return $this; + } + + /** + * @return Money + */ + public function getDebet(): Money + { + return $this->debet; + } + + /** + * @param Money $debet + * @return KasBoekingsregel + */ + public function setDebet(Money $debet): KasBoekingsregel + { + $this->debet = $debet; + return $this; + } + + /** + * @return Money + */ + public function getCredit(): Money + { + return $this->credit; + } + + /** + * @param Money $credit + * @return KasBoekingsregel + */ + public function setCredit(Money $credit): KasBoekingsregel + { + $this->credit = $credit; + return $this; + } + +} diff --git a/src/Model/V2/Kasboeking.php b/src/Model/V2/Kasboeking.php new file mode 100644 index 0000000..5625c07 --- /dev/null +++ b/src/Model/V2/Kasboeking.php @@ -0,0 +1,238 @@ +datum; + } + + /** + * @param \DateTimeInterface|null $datum + * @return Kasboeking + */ + public function setDatum(\DateTimeInterface $datum) + { + $this->datum = $datum; + return $this; + } + + /** + * @return KasBoekingsregel[] + */ + public function getGrootboekBoekingsRegels(): array + { + return $this->grootboekBoekingsRegels; + } + + /** + * @param KasBoekingsregel[] $grootboekBoekingsRegels + * @return Kasboeking + */ + public function setGrootboekBoekingsRegels(KasBoekingsregel ... $grootboekBoekingsRegels) + { + $this->grootboekBoekingsRegels = $grootboekBoekingsRegels; + return $this; + } + + /** + * @return KasBoekingsregel[] + */ + public function getInkoopboekingBoekingsRegels(): array + { + return $this->inkoopboekingBoekingsRegels; + } + + /** + * @param KasBoekingsregel[] $inkoopboekingBoekingsRegels + * @return Kasboeking + */ + public function setInkoopboekingBoekingsRegels(KasBoekingsregel ... $inkoopboekingBoekingsRegels) + { + $this->inkoopboekingBoekingsRegels = $inkoopboekingBoekingsRegels; + return $this; + } + + /** + * @return KasBoekingsregel[] + */ + public function getVerkoopboekingBoekingsRegels(): array + { + return $this->verkoopboekingBoekingsRegels; + } + + /** + * @param KasBoekingsregel[] $verkoopboekingBoekingsRegels + * @return Kasboeking + */ + public function setVerkoopboekingBoekingsRegels(KasBoekingsregel ...$verkoopboekingBoekingsRegels) + { + $this->verkoopboekingBoekingsRegels = $verkoopboekingBoekingsRegels; + return $this; + } + + /** + * @return BtwBoekingsregel[] + */ + public function getBtwBoekingsregels(): ?array + { + return $this->btwBoekingsregels; + } + + /** + * @param BtwBoekingsregel[] $btwBoekingsregels + * @return Kasboeking + */ + public function setBtwBoekingsregels(BtwBoekingsregel ...$btwBoekingsregels) + { + $this->btwBoekingsregels = $btwBoekingsregels; + return $this; + } + + /** + * @return Money + */ + public function getBedragUitgegeven(): Money + { + return $this->bedragUitgegeven; + } + + /** + * @param Money $bedragUitgegeven + * @return Kasboeking + */ + public function setBedragUitgegeven(Money $bedragUitgegeven) + { + $this->bedragUitgegeven = $bedragUitgegeven; + return $this; + } + + /** + * @return Money + */ + public function getBedragOntvangen(): Money + { + return $this->bedragOntvangen; + } + + /** + * @param Money $bedragOntvangen + * @return Kasboeking + */ + public function setBedragOntvangen(Money $bedragOntvangen) + { + $this->bedragOntvangen = $bedragOntvangen; + return $this; + } + + /** + * @return Dagboek + */ + public function getDagboek(): Dagboek + { + return $this->dagboek; + } + + /** + * @param Dagboek $dagboek + * @return Kasboeking + */ + public function setDagboek(Dagboek $dagboek) + { + $this->dagboek = $dagboek; + return $this; + } + + public function assertInBalance(): void + { + $totalCredit = $this->getBedragOntvangen(); + $totalDebet = $this->getBedragUitgegeven(); + + foreach ($this->getGrootboekBoekingsRegels() as $boekingsregel) { + $totalCredit = $totalCredit->subtract($boekingsregel->getCredit()); + $totalDebet = $totalDebet->subtract($boekingsregel->getDebet()); + } + foreach ($this->getInkoopboekingBoekingsRegels() as $boekingsregel) { + $totalCredit = $totalCredit->subtract($boekingsregel->getCredit()); + $totalDebet = $totalDebet->subtract($boekingsregel->getDebet()); + } + foreach ($this->getVerkoopboekingBoekingsRegels() as $boekingsregel) { + $totalCredit = $totalCredit->subtract($boekingsregel->getCredit()); + $totalDebet = $totalDebet->subtract($boekingsregel->getDebet()); + } + foreach ($this->getBtwBoekingsregels() as $boekingsregel) { + $totalCredit = $totalCredit->subtract($boekingsregel->getCredit()); + $totalDebet = $totalDebet->subtract($boekingsregel->getDebet()); + } + + $diff = $totalDebet->subtract($totalCredit); + if (!$diff->isZero()) { + throw new BookingNotInBalanceException('Kasboeking not in balance'); + } + } +} diff --git a/src/Model/V2/Koopboeking.php b/src/Model/V2/Koopboeking.php new file mode 100644 index 0000000..210a25f --- /dev/null +++ b/src/Model/V2/Koopboeking.php @@ -0,0 +1,173 @@ +factuurDatum; + } + + public function setFactuurdatum(?\DateTimeInterface $factuurDatum): self + { + $this->factuurDatum = $factuurDatum; + + return $this; + } + + public function getVervaldatum(): ?\DateTimeInterface + { + return $this->vervalDatum; + } + + public function setVervaldatum(?\DateTimeInterface $vervalDatum): self + { + $this->vervalDatum = $vervalDatum; + + return $this; + } + + public function getFactuurnummer(): string + { + return $this->factuurnummer; + } + + public function setFactuurnummer(string $factuurnummer): self + { + $this->factuurnummer = $factuurnummer; + + return $this; + } + + public function getFactuurbedrag(): Money + { + return $this->factuurbedrag; + } + + public function setFactuurbedrag(Money $factuurbedrag): self + { + $this->factuurbedrag = $factuurbedrag; + + return $this; + } + + public function getBoekingsregels(): array + { + return $this->boekingsregels; + } + + public function setBoekingsregels(Boekingsregel ...$boekingsregels): self + { + $this->boekingsregels = $boekingsregels; + + return $this; + } + + public function getBtw(): array + { + return $this->btw ?? []; + } + + public function setBtw(Btwregel ...$btw): self + { + $this->btw = $btw; + + return $this; + } + + public function getDocuments(): array + { + return $this->documents; + } + + public function addDocument(Document $document): self + { + $this->documents[] = $document; + + return $this; + } + + public function assertInBalance(): void + { + $targetAmount = $this->getFactuurbedrag(); + + foreach ($this->getBoekingsregels() as $boekingsregel) { + $targetAmount = $targetAmount->subtract($boekingsregel->getBedrag()); + } + + foreach ($this->getBtw() as $btw) { + $targetAmount = $targetAmount->subtract($btw->getBtwBedrag()); + } + + if (!$targetAmount->isZero()) { + throw new BookingNotInBalanceException('Koopboeking not in balance'); + } + } +} diff --git a/src/Model/V2/Verkoopboeking.php b/src/Model/V2/Verkoopboeking.php index 14ae86a..c7ce1ac 100644 --- a/src/Model/V2/Verkoopboeking.php +++ b/src/Model/V2/Verkoopboeking.php @@ -8,7 +8,7 @@ use SnelstartPHP\Model\IncassoMachtiging; -final class Verkoopboeking extends Boeking +final class Verkoopboeking extends Koopboeking { /** * De klant/debiteur aan wie de factuur is gericht. @@ -102,4 +102,4 @@ public function setDoorlopendeIncassoMachtiging(?IncassoMachtiging $doorlopendeI return $this; } -} \ No newline at end of file +} diff --git a/src/Request/V2/BoekingRequest.php b/src/Request/V2/BoekingRequest.php index d0b37e6..0c79e13 100644 --- a/src/Request/V2/BoekingRequest.php +++ b/src/Request/V2/BoekingRequest.php @@ -58,6 +58,37 @@ public function updateVerkoopboeking(Model\Verkoopboeking $verkoopboeking): Requ ], Utils::jsonEncode($this->prepareAddOrEditRequestForSerialization($verkoopboeking))); } + public function findKasboeking(UuidInterface $uuid): RequestInterface + { + return new Request("GET", "kasboekingen/" . $uuid->toString()); + } + + public function addKasboeking(Model\Kasboeking $kasboeking): RequestInterface + { + $normalized = $this->prepareAddOrEditRequestForSerialization($kasboeking); + return new Request("POST", "kasboekingen", [ + "Content-Type" => "application/json" + ], \GuzzleHttp\json_encode($normalized)); + } + + public function updateKasboeking(Model\Kasboeking $kasboeking): RequestInterface + { + if ($kasboeking->getId() === null) { + throw PreValidationException::shouldHaveAnIdException(); + } + + return new Request("PUT", "kasboekingen/" . $kasboeking->getId()->toString(), [ + "Content-Type" => "application/json" + ], \GuzzleHttp\json_encode($this->prepareAddOrEditRequestForSerialization($kasboeking))); + } + public function deleteKasboeking(Model\Kasboeking $kasboeking): RequestInterface + { + if ($kasboeking->getId() === null) { + throw PreValidationException::shouldHaveAnIdException(); + } + + return new Request("DELETE", "kasboekingen/" . $kasboeking->getId()->toString()); + } /** * @deprecated Please see DocumentRequest */ @@ -84,4 +115,4 @@ public function addAttachmentToVerkoopboeking(Model\Verkoopboeking $verkoopboeki @trigger_error(sprintf("Please use %s", DocumentRequest::class), \E_USER_DEPRECATED); return (new DocumentRequest($this->serializer))->addVerkoopBoekingDocument($document, $verkoopboeking); } -} \ No newline at end of file +} diff --git a/src/Request/V2/DagboekenRequest.php b/src/Request/V2/DagboekenRequest.php new file mode 100644 index 0000000..9e934f8 --- /dev/null +++ b/src/Request/V2/DagboekenRequest.php @@ -0,0 +1,15 @@ +