<?php
namespace Diplix\KMGBundle\Entity\Accounting;
use Cocur\Slugify\Slugify;
use Diplix\KMGBundle\Entity\BasicEntity;
use Diplix\KMGBundle\Entity\Customer;
use Diplix\KMGBundle\Entity\File;
use Diplix\KMGBundle\Entity\User;
use Diplix\KMGBundle\Form\Accounting\CoopMemberForm;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="acc_documents",
* indexes={@ORM\Index(name="be_deleted",columns={"be_deleted"})},
* uniqueConstraints={
* @ORM\UniqueConstraint(name="docnr_unqiue",columns={"document_type", "document_number"})
* }
* )
* @ORM\Entity(repositoryClass="Diplix\KMGBundle\Repository\DocumentRepository")
*/
class Document extends BasicEntity
{
const TYPE_RECHNUNG = 'R';
const TYPE_GUTSCHRIFT = 'G';
public static $typeMap = [
self::TYPE_GUTSCHRIFT => "Gutschrift",
self::TYPE_RECHNUNG => "Rechnung"
];
const STATUS_ENTWURF = 0;
const STATUS_OFFEN = 1;
const STATUS_MAHNSTUFE1 = 11;
const STATUS_MAHNSTUFE2 = 12;
const STATUS_MAHNSTUFE3 = 13;
const STATUS_CLOSED_THRESHOLD = 50;
const STATUS_BEZAHLT = 50;
const STATUS_STORNIERT = 60;
public static $statusMap = [
self::STATUS_ENTWURF => "Entwurf",
self::STATUS_OFFEN => "Offen",
self::STATUS_MAHNSTUFE1 => "Mahnstufe 1",
self::STATUS_MAHNSTUFE2 => "Mahnstufe 2",
self::STATUS_MAHNSTUFE3 => "Mahnstufe 3",
self::STATUS_BEZAHLT => "Bezahlt",
self::STATUS_STORNIERT => "Storniert"
];
/**
* @ORM\Column(type="integer",name="id")
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(name="document_type", type="string",length=1,options={"fixed":true})
*/
protected $type;
/**
* @ORM\Column(name="document_number", type="string")
*/
protected $number;
/**
* @ORM\Column(name="document_date", type="datetime")
*/
protected $date;
/**
* @ORM\Column(type="text")
*/
protected $receiverAddress;
/**
* @ORM\ManyToOne(targetEntity="Diplix\KMGBundle\Entity\Customer")
* @ORM\JoinColumn(nullable=true)
*/
protected $customer;
/**
* @ORM\ManyToOne(targetEntity="Diplix\KMGBundle\Entity\Accounting\CoopMember")
* @ORM\JoinColumn(nullable=true)
*/
protected $member;
/**
* @ORM\Column(type="integer")
*/
protected $status = self::STATUS_ENTWURF;
/**
* @ORM\Column(type="decimal", nullable=false, precision=12, scale=2,options={"unsigned":false})
*/
protected $totalNet = 0.0;
/**
* @ORM\ManyToOne(targetEntity="Diplix\KMGBundle\Entity\File", fetch="EAGER")
* @ORM\JoinColumn(referencedColumnName="id",nullable=true)
*/
protected $pdfFile;
/**
* @ORM\OneToOne(targetEntity="Diplix\KMGBundle\Entity\Accounting\Billing", fetch="EAGER")
* @ORM\JoinColumn(name="billing_id", referencedColumnName="id")
*/
protected $billing;
/**
* @ORM\ManyToOne(targetEntity="Diplix\KMGBundle\Entity\User",fetch="EXTRA_LAZY")
* @ORM\JoinColumn(nullable=true)
*/
protected $treatedBy = null;
/**
* @ORM\Column(type="integer")
*/
protected $accountingMonth = 0;
/**
* @ORM\Column(type="integer")
*/
protected $accountingYear = 0;
/**
* @ORM\Column(type="datetime", nullable=true);
*/
protected $sentToReceiver = null;
/**
* @ORM\Column(type="text")
*/
protected $headerText = '';
/**
* @ORM\Column(type="text")
*/
protected $footerText = '';
/**
* @ORM\ManyToOne(targetEntity="Diplix\KMGBundle\Entity\File", fetch="EAGER")
* @ORM\JoinColumn(referencedColumnName="id",nullable=true)
*/
protected $reminderPdf;
/**
* @ORM\Column(type="datetime", nullable=true);
*/
protected $reminderSentToReceiver = null;
/**
* @ORM\ManyToOne(targetEntity="Diplix\KMGBundle\Entity\File", fetch="EAGER")
* @ORM\JoinColumn(referencedColumnName="id",nullable=true)
*/
protected $monition1Pdf;
/**
* @ORM\Column(type="datetime", nullable=true);
*/
protected $monition1SentToReceiver = null;
/**
* @ORM\ManyToOne(targetEntity="Diplix\KMGBundle\Entity\File", fetch="EAGER")
* @ORM\JoinColumn(referencedColumnName="id",nullable=true)
*/
protected $monition2Pdf;
/**
* @ORM\Column(type="datetime", nullable=true);
*/
protected $monition2SentToReceiver = null;
/**
* @ORM\Column(type="json")
*/
protected $extraCalculationItems = [];
/**
* @ORM\ManyToOne(targetEntity="Diplix\KMGBundle\Entity\File", fetch="EAGER")
* @ORM\JoinColumn(referencedColumnName="id",nullable=true)
*/
protected $extraPdf;
/**
* @ORM\Column(type="json")
*/
protected $standByDispoData = [];
public function __clone()
{
$this->id = null;
$this->status = self::STATUS_ENTWURF;
$this->pdfFile = null; $this->sentToReceiver = null;
$this->reminderPdf = null; $this->reminderSentToReceiver = null;
$this->monition1Pdf = null; $this->monition1SentToReceiver = null;
$this->monition2Pdf = null; $this->monition2SentToReceiver = null;
$this->treatedBy = null;
$this->billing = null;
}
public function generateFilename()
{
$sl = new Slugify();
$kc = '';
if ($this->getCustomer()!==null)
{
$kc.= 'K' . $sl->slugify(sprintf('%s_,%s',$this->getCustomer()->getCustomerNo(),$this->getCustomer()->getName()));
}
if ($this->getMember()!==null)
{
$kc.= 'M' . $sl->slugify(sprintf('%s_%s',$this->getMember()->getNumber(),$this->getMember()->getName()));
}
$s = $this->getStatus();
$m = (($s>=self::STATUS_MAHNSTUFE1)&&($s<=self::STATUS_MAHNSTUFE3)) ? 'M'.$s.'_' : '';
return sprintf('%s%s_%s_%s.pdf',$m,$this->getType(),$this->getNumber(),$kc);
}
public function recalculateExtraItems()
{
$it = $this->getExtraCalculationItems();
$sum = 0;
foreach ($it as $one)
{
$one->totalNet = $one->amount*$one->quantity;
$sum += $one->totalNet;
}
return $sum;
}
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @return mixed
*/
public function getType()
{
return $this->type;
}
/**
* @param mixed $type
*/
public function setType($type)
{
$this->type = $type;
}
/**
* @return mixed
*/
public function getNumber()
{
return $this->number;
}
/**
* @param mixed $number
*/
public function setNumber($number)
{
$this->number = $number;
}
/**
* @return mixed
*/
public function getReceiverAddress()
{
return $this->receiverAddress;
}
/**
* @param mixed $receiverAddress
*/
public function setReceiverAddress($receiverAddress)
{
$this->receiverAddress = $receiverAddress;
}
/**
* @return null|Customer
*/
public function getCustomer()
{
return $this->customer;
}
/**
* @param mixed $customer
*/
public function setCustomer($customer)
{
$this->customer = $customer;
}
/**
* @return null|CoopMember
*/
public function getMember()
{
return $this->member;
}
/**
* @param mixed $member
*/
public function setMember($member)
{
$this->member = $member;
}
/**
* @return mixed
*/
public function getStatus()
{
return $this->status;
}
/**
* @param mixed $status
*/
public function setStatus($status)
{
$this->status = $status;
}
/**
* @return mixed
*/
public function getTotalNet()
{
return $this->totalNet;
}
/**
* @param mixed $totalNet
*/
public function setTotalNet($totalNet)
{
$this->totalNet = $totalNet;
}
/**
* @return mixed
*/
public function getDate()
{
return $this->date;
}
/**
* @param mixed $date
*/
public function setDate($date)
{
$this->date = $date;
}
/**
* @return Billing
*/
public function getBilling()
{
return $this->billing;
}
/**
* @param mixed $billing
*/
public function setBilling($billing)
{
$this->billing = $billing;
}
/**
* @return File|null
*/
public function getPdfFile()
{
return $this->pdfFile;
}
/**
* @param File|null $pdfFile
*/
public function setPdfFile($pdfFile)
{
$this->pdfFile = $pdfFile;
}
/**
* @return null|User
*/
public function getTreatedBy()
{
return $this->treatedBy;
}
/**
* @param null|User $treatedBy
*/
public function setTreatedBy($treatedBy)
{
$this->treatedBy = $treatedBy;
}
/**
* @return int
*/
public function getAccountingMonth()
{
return $this->accountingMonth;
}
/**
* @param int $accountingMonth
*/
public function setAccountingMonth($accountingMonth)
{
$this->accountingMonth = $accountingMonth;
}
/**
* @return int
*/
public function getAccountingYear()
{
return $this->accountingYear;
}
/**
* @param int $accountingYear
*/
public function setAccountingYear($accountingYear)
{
$this->accountingYear = $accountingYear;
}
/**
* @return \DateTime|null
*/
public function isSentToReceiver()
{
return $this->sentToReceiver;
}
/**
* @param \DateTime|null $sentToReceiver
*/
public function setSentToReceiver($sentToReceiver): void
{
$this->sentToReceiver = $sentToReceiver;
}
/**
* @return string
*/
public function getHeaderText(): string
{
return $this->headerText;
}
/**
* @param string $headerText
*/
public function setHeaderText(string $headerText): void
{
$this->headerText = $headerText;
}
/**
* @return string
*/
public function getFooterText(): string
{
return $this->footerText;
}
/**
* @param string $footerText
*/
public function setFooterText(string $footerText): void
{
$this->footerText = $footerText;
}
/**
* @return mixed
*/
public function getReminderPdf()
{
return $this->reminderPdf;
}
/**
* @param mixed $reminderPdf
*/
public function setReminderPdf($reminderPdf): void
{
$this->reminderPdf = $reminderPdf;
}
/**
* @return mixed
*/
public function getMonition1Pdf()
{
return $this->monition1Pdf;
}
/**
* @param mixed $monition1Pdf
*/
public function setMonition1Pdf($monition1Pdf): void
{
$this->monition1Pdf = $monition1Pdf;
}
/**
* @return mixed
*/
public function getMonition2Pdf()
{
return $this->monition2Pdf;
}
/**
* @param mixed $monition2Pdf
*/
public function setMonition2Pdf($monition2Pdf): void
{
$this->monition2Pdf = $monition2Pdf;
}
/**
* @return null
*/
public function getReminderSentToReceiver()
{
return $this->reminderSentToReceiver;
}
/**
* @param null $reminderSentToReceiver
*/
public function setReminderSentToReceiver($reminderSentToReceiver): void
{
$this->reminderSentToReceiver = $reminderSentToReceiver;
}
/**
* @return null
*/
public function getMonition1SentToReceiver()
{
return $this->monition1SentToReceiver;
}
/**
* @param null $monition1SentToReceiver
*/
public function setMonition1SentToReceiver($monition1SentToReceiver): void
{
$this->monition1SentToReceiver = $monition1SentToReceiver;
}
/**
* @return null
*/
public function getMonition2SentToReceiver()
{
return $this->monition2SentToReceiver;
}
/**
* @param null $monition2SentToReceiver
*/
public function setMonition2SentToReceiver($monition2SentToReceiver): void
{
$this->monition2SentToReceiver = $monition2SentToReceiver;
}
/**
* @return array|JobCalcItem[]
*/
public function getExtraCalculationItems()
{
$ex = $this->extraCalculationItems;
if (($ex === null)||($ex==='')) $ex = [];
return Job::toJciArray($ex);
}
/**
* @param array $extaCalculationItems
*/
public function setExtraCalculationItems($extaCalculationItems)
{
$this->extraCalculationItems = Job::fromObjectArray($extaCalculationItems);
}
/**
* @return File|null
*/
public function getExtraPdf()
{
return $this->extraPdf;
}
/**
* @param File|null $extraPdf
*/
public function setExtraPdf($extraPdf): void
{
$this->extraPdf = $extraPdf;
}
/**
* @return array
*/
public function getStandByDispoData(): array
{
return $this->standByDispoData ?? [];
}
/**
* @param array $standByDispoData
*/
public function setStandByDispoData(array $standByDispoData): void
{
$this->standByDispoData = $standByDispoData;
}
}