From 8da02aa32c14c17e7c4d54044add53de1f8ab9d6 Mon Sep 17 00:00:00 2001 From: Babak Alizadeh Date: Tue, 7 Jan 2025 21:02:12 +0000 Subject: [PATCH] progress in preinvoice --- .../src/Controller/PreinvoiceController.php | 612 +++++++++++++++++- hesabixCore/src/Entity/Business.php | 74 +++ hesabixCore/src/Entity/InvoiceType.php | 37 ++ hesabixCore/src/Entity/Money.php | 37 ++ hesabixCore/src/Entity/Person.php | 37 ++ hesabixCore/src/Entity/PreInvoiceDoc.php | 198 ++++++ hesabixCore/src/Entity/PreInvoiceItem.php | 198 ++++++ hesabixCore/src/Entity/Year.php | 37 ++ public_html/img/logo.png | Bin 0 -> 23715 bytes public_html/img/logo32.png | Bin 0 -> 858 bytes 10 files changed, 1224 insertions(+), 6 deletions(-) create mode 100644 public_html/img/logo.png create mode 100644 public_html/img/logo32.png diff --git a/hesabixCore/src/Controller/PreinvoiceController.php b/hesabixCore/src/Controller/PreinvoiceController.php index fb06ea9..733fe57 100644 --- a/hesabixCore/src/Controller/PreinvoiceController.php +++ b/hesabixCore/src/Controller/PreinvoiceController.php @@ -2,17 +2,617 @@ namespace App\Controller; -use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use App\Entity\PreInvoiceDoc; +use App\Service\Log; +use App\Service\Access; +use App\Service\Explore; +use App\Entity\Commodity; +use App\Service\PluginService; +use App\Service\Provider; +use App\Service\Extractor; +use App\Entity\HesabdariDoc; +use App\Entity\HesabdariRow; +use App\Entity\HesabdariTable; +use App\Entity\InvoiceType; +use App\Entity\Person; +use App\Entity\PrintOptions; +use App\Entity\StoreroomTicket; +use App\Service\Printers; +use App\Service\registryMGR; +use App\Service\SMS; +use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Routing\Attribute\Route; +use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class PreinvoiceController extends AbstractController { - #[Route('/preinvoice', name: 'app_preinvoice')] - public function index(): Response + + #[Route('/api/presell/get/info/{code}', name: 'app_sell_get_info')] + public function app_sell_get_info(Request $request, Access $access, Log $log, EntityManagerInterface $entityManager, string $code): JsonResponse { - return $this->render('preinvoice/index.html.twig', [ - 'controller_name' => 'PreinvoiceController', + $acc = $access->hasRole('sell'); + if (!$acc) + throw $this->createAccessDeniedException(); + $doc = $entityManager->getRepository(PreInvoiceDoc::class)->findOneBy([ + 'bid' => $acc['bid'], + 'code' => $code, + 'money'=> $acc['money'] ]); + if (!$doc) + throw $this->createNotFoundException(); + $result = Explore::ExploreSellDoc($doc); + $profit = 0; + //calculate profit + foreach ($doc->getHesabdariRows() as $item) { + if ($item->getCommodity() && $item->getCommdityCount()) { + if ($acc['bid']->getProfitCalctype() == 'simple') { + $profit = $profit + (($item->getCommodity()->getPriceSell() - $item->getCommodity()->getPriceSell()) * $item->getCommdityCount()); + } + elseif ($acc['bid']->getProfitCalctype() == 'lis') { + $last = $entityManager->getRepository(HesabdariRow::class)->findOneBy([ + 'commodity' => $item->getCommodity(), + 'bs' => 0 + ], [ + 'id' => 'DESC' + ]); + if ($last) { + $price = $last->getBd() / $last->getCommdityCount(); + $profit = $profit + ((($item->getBs() / $item->getCommdityCount()) - $price) * $item->getCommdityCount()); + } else { + $profit = $profit + $item->getBs(); + } + } else { + $lasts = $entityManager->getRepository(HesabdariRow::class)->findBy([ + 'commodity' => $item->getCommodity(), + 'bs' => 0 + ], [ + 'id' => 'DESC' + ]); + $avg = 0; + $count = 0; + foreach ($lasts as $last) { + $avg = $avg + $last->getBd(); + $count = $count + $last->getCommdityCount(); + } + if ($count != 0) { + $price = $avg / $count; + $profit = $profit + ((($item->getBs() / $item->getCommdityCount()) - $price) * $item->getCommdityCount()); + } + else{ + $profit = $profit + $item->getBs(); + } + + } + + //round output + $profit = round($profit); + } + } + $result['profit'] = $profit; + return $this->json($result); + } + + #[Route('/api/presell/mod', name: 'app_sell_mod')] + public function app_sell_mod(registryMGR $registryMGR, PluginService $pluginService, SMS $SMS, Provider $provider, Extractor $extractor, Request $request, Access $access, Log $log, EntityManagerInterface $entityManager): JsonResponse + { + $params = []; + if ($content = $request->getContent()) { + $params = json_decode($content, true); + } + + $acc = $access->hasRole('sell'); + if (!$acc) + throw $this->createAccessDeniedException(); + + if (!array_key_exists('update', $params)) { + return $this->json($extractor->paramsNotSend()); + } + if ($params['update'] != '') { + $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ + 'bid' => $acc['bid'], + 'year' => $acc['year'], + 'code' => $params['update'], + 'money'=> $acc['money'] + ]); + if (!$doc) + return $this->json($extractor->notFound()); + + $rows = $doc->getHesabdariRows(); + foreach ($rows as $row) + $entityManager->remove($row); + } else { + $doc = new HesabdariDoc(); + $doc->setBid($acc['bid']); + $doc->setYear($acc['year']); + $doc->setDateSubmit(time()); + $doc->setType('sell'); + $doc->setSubmitter($this->getUser()); + $doc->setMoney($acc['money']); + $doc->setCode($provider->getAccountingCode($acc['bid'], 'accounting')); + } + if ($params['transferCost'] != 0) { + $hesabdariRow = new HesabdariRow(); + $hesabdariRow->setDes('حمل و نقل کالا'); + $hesabdariRow->setBid($acc['bid']); + $hesabdariRow->setYear($acc['year']); + $hesabdariRow->setDoc($doc); + $hesabdariRow->setBs($params['transferCost']); + $hesabdariRow->setBd(0); + $ref = $entityManager->getRepository(HesabdariTable::class)->findOneBy([ + 'code' => '61' // transfer cost income + ]); + $hesabdariRow->setRef($ref); + $entityManager->persist($hesabdariRow); + } + if ($params['discountAll'] != 0) { + $hesabdariRow = new HesabdariRow(); + $hesabdariRow->setDes('تخفیف فاکتور'); + $hesabdariRow->setBid($acc['bid']); + $hesabdariRow->setYear($acc['year']); + $hesabdariRow->setDoc($doc); + $hesabdariRow->setBs(0); + $hesabdariRow->setBd($params['discountAll']); + $ref = $entityManager->getRepository(HesabdariTable::class)->findOneBy([ + 'code' => '104' // سایر هزینه های پخش و فروش + ]); + $hesabdariRow->setRef($ref); + $entityManager->persist($hesabdariRow); + } + $doc->setDes($params['des']); + $doc->setDate($params['date']); + $sumTax = 0; + $sumTotal = 0; + foreach ($params['rows'] as $row) { + $sumTax += $row['tax']; + $sumTotal += $row['sumWithoutTax']; + $hesabdariRow = new HesabdariRow(); + $hesabdariRow->setDes($row['des']); + $hesabdariRow->setBid($acc['bid']); + $hesabdariRow->setYear($acc['year']); + $hesabdariRow->setDoc($doc); + $hesabdariRow->setBs($row['sumWithoutTax'] + $row['tax']); + $hesabdariRow->setBd(0); + $hesabdariRow->setDiscount($row['discount']); + $hesabdariRow->setTax($row['tax']); + $ref = $entityManager->getRepository(HesabdariTable::class)->findOneBy([ + 'code' => '53' // sell commodity + ]); + $hesabdariRow->setRef($ref); + $row['count'] = str_replace(',', '', $row['count']); + $commodity = $entityManager->getRepository(Commodity::class)->findOneBy([ + 'id' => $row['commodity']['id'], + 'bid' => $acc['bid'] + ]); + if (!$commodity) + return $this->json($extractor->paramsNotSend()); + $hesabdariRow->setCommodity($commodity); + $hesabdariRow->setCommdityCount($row['count']); + $entityManager->persist($hesabdariRow); + + //update commodity price for auto update price option + if ($acc['bid']->isCommodityUpdateSellPriceAuto() == true && $commodity->getPriceSell() != $row['price']) { + $commodity->setPriceSell($row['price']); + $entityManager->persist($commodity); + } + } + //set amount of document + $doc->setAmount($sumTax + $sumTotal - $params['discountAll'] + $params['transferCost']); + //set person person + $hesabdariRow = new HesabdariRow(); + $hesabdariRow->setDes('فاکتور فروش'); + $hesabdariRow->setBid($acc['bid']); + $hesabdariRow->setYear($acc['year']); + $hesabdariRow->setDoc($doc); + $hesabdariRow->setBs(0); + $hesabdariRow->setBd($sumTax + $sumTotal + $params['transferCost'] - $params['discountAll']); + $ref = $entityManager->getRepository(HesabdariTable::class)->findOneBy([ + 'code' => '3' // persons + ]); + $hesabdariRow->setRef($ref); + $person = $entityManager->getRepository(Person::class)->findOneBy([ + 'bid' => $acc['bid'], + 'code' => $params['person']['code'] + ]); + if (!$person) + return $this->json($extractor->paramsNotSend()); + $hesabdariRow->setPerson($person); + $entityManager->persist($hesabdariRow); + + //set tax info + + $entityManager->persist($doc); + $entityManager->flush(); + if(!$doc->getShortlink()){ + $doc->setShortlink($doc->getId()); + } + + //add pair docs + if(array_key_exists('pair_docs',$params)){ + foreach($params['pair_docs'] as $pairCode){ + $pair = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ + 'bid'=>$acc['bid'], + 'code'=>$pairCode, + 'type'=>'buy' + ]); + if($pair){ + $doc->addPairDoc($pair); + } + } + } + $entityManager->persist($doc); + $entityManager->flush(); + + $log->insert( + 'حسابداری', + 'سند حسابداری شماره ' . $doc->getCode() . ' ثبت / ویرایش شد.', + $this->getUser(), + $request->headers->get('activeBid'), + $doc + ); + //send sms to customer + if (array_key_exists('sms', $params)) { + if ($params['sms'] == true) { + if ($pluginService->isActive('accpro', $acc['bid']) && $person->getMobile() != '' && $acc['bid']->getTel()) { + return $this->json([ + 'result' => + $SMS->sendByBalance( + [$person->getnikename(), 'sell/' . $acc['bid']->getId() . '/' . $doc->getId(), $acc['bid']->getName(), $acc['bid']->getTel()], + $registryMGR->get('sms', 'plugAccproSharefaktor'), + $person->getMobile(), + $acc['bid'], + $this->getUser(), + 3 + ) + ]); + } else { + return $this->json([ + 'result' => + $SMS->sendByBalance( + [$acc['bid']->getName(), 'sell/' . $acc['bid']->getId() . '/' . $doc->getId()], + $registryMGR->get('sms', 'sharefaktor'), + $person->getMobile(), + $acc['bid'], + $this->getUser(), + 3 + ) + ]); + } + } + } + return $this->json($extractor->operationSuccess()); + } + + #[Route('/api/presell/label/change', name: 'app_sell_label_change')] + public function app_sell_label_change(Request $request, Access $access, Extractor $extractor, Log $log, EntityManagerInterface $entityManager): JsonResponse + { + $params = []; + if ($content = $request->getContent()) { + $params = json_decode($content, true); + } + + $acc = $access->hasRole('sell'); + if (!$acc) + throw $this->createAccessDeniedException(); + if ($params['label'] != 'clear') { + $label = $entityManager->getRepository(InvoiceType::class)->findOneBy([ + 'code' => $params['label']['code'], + 'type' => 'sell' + ]); + if (!$label) + return $this->json($extractor->notFound()); + } + foreach ($params['items'] as $item) { + $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ + 'bid' => $acc['bid'], + 'year' => $acc['year'], + 'code' => $item['code'], + 'money'=> $acc['money'] + ]); + if (!$doc) + return $this->json($extractor->notFound()); + if ($params['label'] != 'clear') { + $doc->setInvoiceLabel($label); + $entityManager->persist($doc); + $log->insert( + 'حسابداری', + ' تغییر برچسب فاکتور‌ شماره ' . $doc->getCode() . ' به ' . $label->getLabel(), + $this->getUser(), + $acc['bid']->getId(), + $doc + ); + } else { + $doc->setInvoiceLabel(null); + $entityManager->persist($doc); + $log->insert( + 'حسابداری', + ' حذف برچسب فاکتور‌ شماره ' . $doc->getCode(), + $this->getUser(), + $acc['bid']->getId(), + $doc + ); + } + } + $entityManager->flush(); + return $this->json($extractor->operationSuccess()); + } + + #[Route('/api/presell/docs/search', name: 'app_sell_docs_search')] + public function app_sell_docs_search(Provider $provider, Request $request, Access $access, Log $log, EntityManagerInterface $entityManager): JsonResponse + { + $acc = $access->hasRole('sell'); + if (!$acc) + throw $this->createAccessDeniedException(); + + $params = []; + if ($content = $request->getContent()) { + $params = json_decode($content, true); + } + $data = $entityManager->getRepository(HesabdariDoc::class)->findBy([ + 'bid' => $acc['bid'], + 'year' => $acc['year'], + 'type' => 'sell', + 'money'=> $acc['money'] + ], [ + 'id' => 'DESC' + ]); + + $dataTemp = []; + foreach ($data as $item) { + $temp = [ + 'id' => $item->getId(), + 'dateSubmit' => $item->getDateSubmit(), + 'date' => $item->getDate(), + 'type' => $item->getType(), + 'code' => $item->getCode(), + 'des' => $item->getDes(), + 'amount' => $item->getAmount(), + 'submitter' => $item->getSubmitter()->getFullName(), + ]; + $mainRow = $entityManager->getRepository(HesabdariRow::class)->getNotEqual($item, 'person'); + $temp['person'] = ''; + if ($mainRow) + $temp['person'] = Explore::ExplorePerson($mainRow->getPerson()); + + $temp['label'] = null; + if ($item->getInvoiceLabel()) { + $temp['label'] = [ + 'code' => $item->getInvoiceLabel()->getCode(), + 'label' => $item->getInvoiceLabel()->getLabel() + ]; + } + + $temp['relatedDocsCount'] = count($item->getRelatedDocs()); + $pays = 0; + foreach ($item->getRelatedDocs() as $relatedDoc) { + $pays += $relatedDoc->getAmount(); + } + $temp['relatedDocsPays'] = $pays; + // this variable is for store profit of invoice + $temp['profit'] = 0; + foreach ($item->getHesabdariRows() as $item) { + if ($item->getRef()->getCode() == '104') { + $temp['discountAll'] = $item->getBd(); + } elseif ($item->getRef()->getCode() == '61') { + $temp['transferCost'] = $item->getBs(); + } + + //calculate profit + if ($item->getCommodity() && $item->getCommdityCount()) { + if ($acc['bid']->getProfitCalctype() == 'lis') { + $last = $entityManager->getRepository(HesabdariRow::class)->findOneBy([ + 'commodity' => $item->getCommodity(), + 'bs' => 0 + ], [ + 'id' => 'DESC' + ]); + if ($last) { + $price = $last->getBd() / $last->getCommdityCount(); + $temp['profit'] = $temp['profit'] + ((($item->getBs() / $item->getCommdityCount()) - $price) * $item->getCommdityCount()); + } else { + $temp['profit'] = $temp['profit'] + $item->getBs(); + } + } else { + $lasts = $entityManager->getRepository(HesabdariRow::class)->findBy([ + 'commodity' => $item->getCommodity(), + 'bs' => 0 + ], [ + 'id' => 'DESC' + ]); + $avg = 0; + $count = 0; + foreach ($lasts as $last) { + $avg = $avg + $last->getBd(); + $count = $count + $last->getCommdityCount(); + } + if ($count != 0) { + $price = $avg / $count; + $temp['profit'] = $temp['profit'] + ((($item->getBs() / $item->getCommdityCount()) - $price) * $item->getCommdityCount()); + } + else{ + $temp['profit'] = $temp['profit'] + $item->getBs(); + } + } + + //round output + $temp['profit'] = round($temp['profit']); + } + + } + if (!array_key_exists('discountAll', $temp)) + $temp['discountAll'] = 0; + if (!array_key_exists('transferCost', $temp)) + $temp['transferCost'] = 0; + $dataTemp[] = $temp; + } + return $this->json($dataTemp); + } + + #[Route('/api/presell/posprinter/invoice', name: 'app_sell_posprinter_invoice')] + public function app_sell_posprinter_invoice(Printers $printers, Provider $provider, Request $request, Access $access, Log $log, EntityManagerInterface $entityManager): JsonResponse + { + $params = []; + if ($content = $request->getContent()) { + $params = json_decode($content, true); + } + + $acc = $access->hasRole('sell'); + if (!$acc) + throw $this->createAccessDeniedException(); + + $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ + 'bid' => $acc['bid'], + 'code' => $params['code'], + 'money'=> $acc['money'] + ]); + if (!$doc) + throw $this->createNotFoundException(); + $pdfPid = 0; + if ($params['pdf']) { + $pdfPid = $provider->createPrint( + $acc['bid'], + $this->getUser(), + $this->renderView('pdf/posPrinters/presell.html.twig', [ + 'bid' => $acc['bid'], + 'doc' => $doc, + 'rows' => $doc->getHesabdariRows(), + 'printInvoice' => $params['posPrint'], + 'printcashdeskRecp' => $params['posPrintRecp'], + ]), + true + ); + } + + + if ($params['posPrint'] == true) { + $pid = $provider->createPrint( + $acc['bid'], + $this->getUser(), + $this->renderView('pdf/posPrinters/justSell.html.twig', [ + 'bid' => $acc['bid'], + 'doc' => $doc, + 'rows' => $doc->getHesabdariRows(), + ]), + true + ); + $printers->addFile($pid, $acc, "fastSellInvoice"); + } + if ($params['posPrintRecp'] == true) { + $pid = $provider->createPrint( + $acc['bid'], + $this->getUser(), + $this->renderView('pdf/posPrinters/cashdesk.html.twig', [ + 'bid' => $acc['bid'], + 'doc' => $doc, + 'rows' => $doc->getHesabdariRows(), + ]), + true + ); + $printers->addFile($pid, $acc, "fastSellCashdesk"); + } + + return $this->json(['id' => $pdfPid]); + } + + #[Route('/api/presell/print/invoice', name: 'app_sell_print_invoice')] + public function app_sell_print_invoice(Printers $printers, Provider $provider, Request $request, Access $access, Log $log, EntityManagerInterface $entityManager): JsonResponse + { + $params = []; + if ($content = $request->getContent()) { + $params = json_decode($content, true); + } + + $acc = $access->hasRole('sell'); + if (!$acc) + throw $this->createAccessDeniedException(); + + $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ + 'bid' => $acc['bid'], + 'code' => $params['code'], + 'money'=> $acc['money'] + ]); + if (!$doc) + throw $this->createNotFoundException(); + $person = null; + $discount = 0; + $transfer = 0; + foreach ($doc->getHesabdariRows() as $item) { + if ($item->getPerson()) { + $person = $item->getPerson(); + } elseif ($item->getRef()->getCode() == 104) { + $discount = $item->getBd(); + } elseif ($item->getRef()->getCode() == 61) { + $transfer = $item->getBs(); + } + } + $pdfPid = 0; + if ($params['pdf']) { + $printOptions = [ + 'bidInfo' => true, + 'pays' => true, + 'taxInfo' => true, + 'discountInfo' => true, + 'note' => true, + 'paper' => 'A4-L' + ]; + if (array_key_exists('printOptions', $params)) { + if (array_key_exists('bidInfo', $params['printOptions'])) { + $printOptions['bidInfo'] = $params['printOptions']['bidInfo']; + } + if (array_key_exists('pays', $params['printOptions'])) { + $printOptions['pays'] = $params['printOptions']['pays']; + } + if (array_key_exists('taxInfo', $params['printOptions'])) { + $printOptions['taxInfo'] = $params['printOptions']['taxInfo']; + } + if (array_key_exists('discountInfo', $params['printOptions'])) { + $printOptions['discountInfo'] = $params['printOptions']['discountInfo']; + } + if (array_key_exists('note', $params['printOptions'])) { + $printOptions['note'] = $params['printOptions']['note']; + } + if (array_key_exists('paper', $params['printOptions'])) { + $printOptions['paper'] = $params['printOptions']['paper']; + } + } + $note = ''; + $printSettings = $entityManager->getRepository(PrintOptions::class)->findOneBy(['bid' => $acc['bid']]); + if ($printSettings) { + $note = $printSettings->getSellNoteString(); + } + $pdfPid = $provider->createPrint( + $acc['bid'], + $this->getUser(), + $this->renderView('pdf/printers/presell.html.twig', [ + 'bid' => $acc['bid'], + 'doc' => $doc, + 'rows' => $doc->getHesabdariRows(), + 'person' => $person, + 'printInvoice' => $params['printers'], + 'discount' => $discount, + 'transfer' => $transfer, + 'printOptions' => $printOptions, + 'note' => $note + ]), + false, + $printOptions['paper'] + ); + } + if ($params['printers'] == true) { + $pid = $provider->createPrint( + $acc['bid'], + $this->getUser(), + $this->renderView('pdf/posPrinters/justSell.html.twig', [ + 'bid' => $acc['bid'], + 'doc' => $doc, + 'rows' => $doc->getHesabdariRows(), + ]), + false + ); + $printers->addFile($pid, $acc, "fastSellInvoice"); + } + return $this->json(['id' => $pdfPid]); } } diff --git a/hesabixCore/src/Entity/Business.php b/hesabixCore/src/Entity/Business.php index 8ebc29b..c501719 100644 --- a/hesabixCore/src/Entity/Business.php +++ b/hesabixCore/src/Entity/Business.php @@ -258,6 +258,18 @@ class Business #[ORM\ManyToMany(targetEntity: Money::class, inversedBy: 'bids')] private Collection $extraMoney; + /** + * @var Collection + */ + #[ORM\OneToMany(mappedBy: 'bid', targetEntity: PreInvoiceDoc::class, orphanRemoval: true)] + private Collection $preInvoiceDocs; + + /** + * @var Collection + */ + #[ORM\OneToMany(mappedBy: 'bid', targetEntity: PreInvoiceItem::class, orphanRemoval: true)] + private Collection $preInvoiceItems; + public function __construct() { $this->logs = new ArrayCollection(); @@ -294,6 +306,8 @@ class Business $this->printOptions = new ArrayCollection(); $this->projects = new ArrayCollection(); $this->extraMoney = new ArrayCollection(); + $this->preInvoiceDocs = new ArrayCollection(); + $this->preInvoiceItems = new ArrayCollection(); } public function getId(): ?int @@ -1818,4 +1832,64 @@ class Business return $this; } + + /** + * @return Collection + */ + public function getPreInvoiceDocs(): Collection + { + return $this->preInvoiceDocs; + } + + public function addPreInvoiceDoc(PreInvoiceDoc $preInvoiceDoc): static + { + if (!$this->preInvoiceDocs->contains($preInvoiceDoc)) { + $this->preInvoiceDocs->add($preInvoiceDoc); + $preInvoiceDoc->setBid($this); + } + + return $this; + } + + public function removePreInvoiceDoc(PreInvoiceDoc $preInvoiceDoc): static + { + if ($this->preInvoiceDocs->removeElement($preInvoiceDoc)) { + // set the owning side to null (unless already changed) + if ($preInvoiceDoc->getBid() === $this) { + $preInvoiceDoc->setBid(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getPreInvoiceItems(): Collection + { + return $this->preInvoiceItems; + } + + public function addPreInvoiceItem(PreInvoiceItem $preInvoiceItem): static + { + if (!$this->preInvoiceItems->contains($preInvoiceItem)) { + $this->preInvoiceItems->add($preInvoiceItem); + $preInvoiceItem->setBid($this); + } + + return $this; + } + + public function removePreInvoiceItem(PreInvoiceItem $preInvoiceItem): static + { + if ($this->preInvoiceItems->removeElement($preInvoiceItem)) { + // set the owning side to null (unless already changed) + if ($preInvoiceItem->getBid() === $this) { + $preInvoiceItem->setBid(null); + } + } + + return $this; + } } diff --git a/hesabixCore/src/Entity/InvoiceType.php b/hesabixCore/src/Entity/InvoiceType.php index 432aff7..0e55350 100644 --- a/hesabixCore/src/Entity/InvoiceType.php +++ b/hesabixCore/src/Entity/InvoiceType.php @@ -30,9 +30,16 @@ class InvoiceType #[ORM\OneToMany(mappedBy: 'InvoiceLabel', targetEntity: HesabdariDoc::class)] private Collection $hesabdariDocs; + /** + * @var Collection + */ + #[ORM\OneToMany(mappedBy: 'invoiceLabel', targetEntity: PreInvoiceDoc::class)] + private Collection $preInvoiceDocs; + public function __construct() { $this->hesabdariDocs = new ArrayCollection(); + $this->preInvoiceDocs = new ArrayCollection(); } public function getId(): ?int @@ -117,4 +124,34 @@ class InvoiceType return $this; } + + /** + * @return Collection + */ + public function getPreInvoiceDocs(): Collection + { + return $this->preInvoiceDocs; + } + + public function addPreInvoiceDoc(PreInvoiceDoc $preInvoiceDoc): static + { + if (!$this->preInvoiceDocs->contains($preInvoiceDoc)) { + $this->preInvoiceDocs->add($preInvoiceDoc); + $preInvoiceDoc->setInvoiceLabel($this); + } + + return $this; + } + + public function removePreInvoiceDoc(PreInvoiceDoc $preInvoiceDoc): static + { + if ($this->preInvoiceDocs->removeElement($preInvoiceDoc)) { + // set the owning side to null (unless already changed) + if ($preInvoiceDoc->getInvoiceLabel() === $this) { + $preInvoiceDoc->setInvoiceLabel(null); + } + } + + return $this; + } } diff --git a/hesabixCore/src/Entity/Money.php b/hesabixCore/src/Entity/Money.php index d59d781..146c4d4 100644 --- a/hesabixCore/src/Entity/Money.php +++ b/hesabixCore/src/Entity/Money.php @@ -51,6 +51,12 @@ class Money #[ORM\OneToMany(mappedBy: 'money', targetEntity: Salary::class)] private Collection $salaries; + /** + * @var Collection + */ + #[ORM\OneToMany(mappedBy: 'money', targetEntity: PreInvoiceDoc::class, orphanRemoval: true)] + private Collection $preInvoiceDocs; + public function __construct() { $this->businesses = new ArrayCollection(); @@ -58,6 +64,7 @@ class Money $this->bids = new ArrayCollection(); $this->cashdesks = new ArrayCollection(); $this->salaries = new ArrayCollection(); + $this->preInvoiceDocs = new ArrayCollection(); } public function getId(): ?int @@ -259,4 +266,34 @@ class Money return $this; } + + /** + * @return Collection + */ + public function getPreInvoiceDocs(): Collection + { + return $this->preInvoiceDocs; + } + + public function addPreInvoiceDoc(PreInvoiceDoc $preInvoiceDoc): static + { + if (!$this->preInvoiceDocs->contains($preInvoiceDoc)) { + $this->preInvoiceDocs->add($preInvoiceDoc); + $preInvoiceDoc->setMoney($this); + } + + return $this; + } + + public function removePreInvoiceDoc(PreInvoiceDoc $preInvoiceDoc): static + { + if ($this->preInvoiceDocs->removeElement($preInvoiceDoc)) { + // set the owning side to null (unless already changed) + if ($preInvoiceDoc->getMoney() === $this) { + $preInvoiceDoc->setMoney(null); + } + } + + return $this; + } } diff --git a/hesabixCore/src/Entity/Person.php b/hesabixCore/src/Entity/Person.php index a8d3830..185e559 100644 --- a/hesabixCore/src/Entity/Person.php +++ b/hesabixCore/src/Entity/Person.php @@ -143,6 +143,12 @@ class Person #[ORM\OneToMany(mappedBy: 'salesman', targetEntity: HesabdariDoc::class)] private Collection $hesabdariDocs; + /** + * @var Collection + */ + #[ORM\OneToMany(mappedBy: 'salesman', targetEntity: PreInvoiceDoc::class)] + private Collection $preinvoiceDocsSalemans; + public function __construct() { $this->hesabdariRows = new ArrayCollection(); @@ -156,6 +162,7 @@ class Person $this->plugRepserviceOrders = new ArrayCollection(); $this->preInvoiceDocs = new ArrayCollection(); $this->hesabdariDocs = new ArrayCollection(); + $this->preinvoiceDocsSalemans = new ArrayCollection(); } public function getId(): ?int @@ -810,4 +817,34 @@ class Person return $this; } + + /** + * @return Collection + */ + public function getPreinvoiceDocsSalemans(): Collection + { + return $this->preinvoiceDocsSalemans; + } + + public function addPreinvoiceDocsSaleman(PreInvoiceDoc $preinvoiceDocsSaleman): static + { + if (!$this->preinvoiceDocsSalemans->contains($preinvoiceDocsSaleman)) { + $this->preinvoiceDocsSalemans->add($preinvoiceDocsSaleman); + $preinvoiceDocsSaleman->setSalesman($this); + } + + return $this; + } + + public function removePreinvoiceDocsSaleman(PreInvoiceDoc $preinvoiceDocsSaleman): static + { + if ($this->preinvoiceDocsSalemans->removeElement($preinvoiceDocsSaleman)) { + // set the owning side to null (unless already changed) + if ($preinvoiceDocsSaleman->getSalesman() === $this) { + $preinvoiceDocsSaleman->setSalesman(null); + } + } + + return $this; + } } diff --git a/hesabixCore/src/Entity/PreInvoiceDoc.php b/hesabixCore/src/Entity/PreInvoiceDoc.php index 6f0ddbe..cf9d1f9 100644 --- a/hesabixCore/src/Entity/PreInvoiceDoc.php +++ b/hesabixCore/src/Entity/PreInvoiceDoc.php @@ -24,6 +24,48 @@ class PreInvoiceDoc #[ORM\JoinColumn(nullable: false)] private ?Person $person = null; + #[ORM\ManyToOne(inversedBy: 'preInvoiceDocs')] + #[ORM\JoinColumn(nullable: false)] + private ?Business $bid = null; + + #[ORM\ManyToOne(inversedBy: 'preInvoiceDocs')] + #[ORM\JoinColumn(nullable: false)] + private ?Money $money = null; + + #[ORM\ManyToOne(inversedBy: 'preInvoiceDocs')] + #[ORM\JoinColumn(nullable: false)] + private ?Year $year = null; + + #[ORM\Column(length: 80)] + private ?string $date = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $des = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $amount = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $mdate = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $plugin = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $refData = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $shortlink = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $status = null; + + #[ORM\ManyToOne(inversedBy: 'preInvoiceDocs')] + private ?InvoiceType $invoiceLabel = null; + + #[ORM\ManyToOne(inversedBy: 'preinvoiceDocsSalemans')] + private ?Person $salesman = null; + public function getId(): ?int { return $this->id; @@ -64,4 +106,160 @@ class PreInvoiceDoc return $this; } + + public function getBid(): ?Business + { + return $this->bid; + } + + public function setBid(?Business $bid): static + { + $this->bid = $bid; + + return $this; + } + + public function getMoney(): ?Money + { + return $this->money; + } + + public function setMoney(?Money $money): static + { + $this->money = $money; + + return $this; + } + + public function getYear(): ?Year + { + return $this->year; + } + + public function setYear(?Year $year): static + { + $this->year = $year; + + return $this; + } + + public function getDate(): ?string + { + return $this->date; + } + + public function setDate(string $date): static + { + $this->date = $date; + + return $this; + } + + public function getDes(): ?string + { + return $this->des; + } + + public function setDes(?string $des): static + { + $this->des = $des; + + return $this; + } + + public function getAmount(): ?string + { + return $this->amount; + } + + public function setAmount(?string $amount): static + { + $this->amount = $amount; + + return $this; + } + + public function getMdate(): ?string + { + return $this->mdate; + } + + public function setMdate(?string $mdate): static + { + $this->mdate = $mdate; + + return $this; + } + + public function getPlugin(): ?string + { + return $this->plugin; + } + + public function setPlugin(?string $plugin): static + { + $this->plugin = $plugin; + + return $this; + } + + public function getRefData(): ?string + { + return $this->refData; + } + + public function setRefData(?string $refData): static + { + $this->refData = $refData; + + return $this; + } + + public function getShortlink(): ?string + { + return $this->shortlink; + } + + public function setShortlink(?string $shortlink): static + { + $this->shortlink = $shortlink; + + return $this; + } + + public function getStatus(): ?string + { + return $this->status; + } + + public function setStatus(?string $status): static + { + $this->status = $status; + + return $this; + } + + public function getInvoiceLabel(): ?InvoiceType + { + return $this->invoiceLabel; + } + + public function setInvoiceLabel(?InvoiceType $invoiceLabel): static + { + $this->invoiceLabel = $invoiceLabel; + + return $this; + } + + public function getSalesman(): ?Person + { + return $this->salesman; + } + + public function setSalesman(?Person $salesman): static + { + $this->salesman = $salesman; + + return $this; + } } diff --git a/hesabixCore/src/Entity/PreInvoiceItem.php b/hesabixCore/src/Entity/PreInvoiceItem.php index 709f933..0ce48dd 100644 --- a/hesabixCore/src/Entity/PreInvoiceItem.php +++ b/hesabixCore/src/Entity/PreInvoiceItem.php @@ -17,6 +17,48 @@ class PreInvoiceItem #[ORM\JoinColumn(nullable: false)] private ?Commodity $commodity = null; + #[ORM\Column(length: 100, nullable: true)] + private ?string $commodityCount = null; + + #[ORM\Column(length: 100, nullable: true)] + private ?string $bs = null; + + #[ORM\Column(length: 100, nullable: true)] + private ?string $bd = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $des = null; + + #[ORM\ManyToOne] + private ?Person $person = null; + + #[ORM\ManyToOne] + private ?BankAccount $bank = null; + + #[ORM\ManyToOne] + private ?Cashdesk $cashdesk = null; + + #[ORM\ManyToOne] + private ?Salary $salary = null; + + #[ORM\ManyToOne(inversedBy: 'preInvoiceItems')] + #[ORM\JoinColumn(nullable: false)] + private ?Business $bid = null; + + #[ORM\ManyToOne] + #[ORM\JoinColumn(nullable: false)] + private ?Year $year = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $discount = null; + + #[ORM\Column(length: 255, nullable: true)] + private ?string $tax = null; + + #[ORM\ManyToOne] + #[ORM\JoinColumn(nullable: false)] + private ?HesabdariTable $refID = null; + public function getId(): ?int { return $this->id; @@ -33,4 +75,160 @@ class PreInvoiceItem return $this; } + + public function getCommodityCount(): ?string + { + return $this->commodityCount; + } + + public function setCommodityCount(?string $commodityCount): static + { + $this->commodityCount = $commodityCount; + + return $this; + } + + public function getBs(): ?string + { + return $this->bs; + } + + public function setBs(?string $bs): static + { + $this->bs = $bs; + + return $this; + } + + public function getBd(): ?string + { + return $this->bd; + } + + public function setBd(?string $bd): static + { + $this->bd = $bd; + + return $this; + } + + public function getDes(): ?string + { + return $this->des; + } + + public function setDes(?string $des): static + { + $this->des = $des; + + return $this; + } + + public function getPerson(): ?Person + { + return $this->person; + } + + public function setPerson(?Person $person): static + { + $this->person = $person; + + return $this; + } + + public function getBank(): ?BankAccount + { + return $this->bank; + } + + public function setBank(?BankAccount $bank): static + { + $this->bank = $bank; + + return $this; + } + + public function getCashdesk(): ?Cashdesk + { + return $this->cashdesk; + } + + public function setCashdesk(?Cashdesk $cashdesk): static + { + $this->cashdesk = $cashdesk; + + return $this; + } + + public function getSalary(): ?Salary + { + return $this->salary; + } + + public function setSalary(?Salary $salary): static + { + $this->salary = $salary; + + return $this; + } + + public function getBid(): ?Business + { + return $this->bid; + } + + public function setBid(?Business $bid): static + { + $this->bid = $bid; + + return $this; + } + + public function getYear(): ?Year + { + return $this->year; + } + + public function setYear(?Year $year): static + { + $this->year = $year; + + return $this; + } + + public function getDiscount(): ?string + { + return $this->discount; + } + + public function setDiscount(?string $discount): static + { + $this->discount = $discount; + + return $this; + } + + public function getTax(): ?string + { + return $this->tax; + } + + public function setTax(?string $tax): static + { + $this->tax = $tax; + + return $this; + } + + public function getRefID(): ?HesabdariTable + { + return $this->refID; + } + + public function setRefID(?HesabdariTable $refID): static + { + $this->refID = $refID; + + return $this; + } } diff --git a/hesabixCore/src/Entity/Year.php b/hesabixCore/src/Entity/Year.php index 0d5d10a..501a2d3 100644 --- a/hesabixCore/src/Entity/Year.php +++ b/hesabixCore/src/Entity/Year.php @@ -48,11 +48,18 @@ class Year #[Ignore] private Collection $storeroomTickets; + /** + * @var Collection + */ + #[ORM\OneToMany(mappedBy: 'year', targetEntity: PreInvoiceDoc::class, orphanRemoval: true)] + private Collection $preInvoiceDocs; + public function __construct() { $this->hesabdariDocs = new ArrayCollection(); $this->hesabdariRows = new ArrayCollection(); $this->storeroomTickets = new ArrayCollection(); + $this->preInvoiceDocs = new ArrayCollection(); } public function getId(): ?int @@ -221,4 +228,34 @@ class Year return $this; } + + /** + * @return Collection + */ + public function getPreInvoiceDocs(): Collection + { + return $this->preInvoiceDocs; + } + + public function addPreInvoiceDoc(PreInvoiceDoc $preInvoiceDoc): static + { + if (!$this->preInvoiceDocs->contains($preInvoiceDoc)) { + $this->preInvoiceDocs->add($preInvoiceDoc); + $preInvoiceDoc->setYear($this); + } + + return $this; + } + + public function removePreInvoiceDoc(PreInvoiceDoc $preInvoiceDoc): static + { + if ($this->preInvoiceDocs->removeElement($preInvoiceDoc)) { + // set the owning side to null (unless already changed) + if ($preInvoiceDoc->getYear() === $this) { + $preInvoiceDoc->setYear(null); + } + } + + return $this; + } } diff --git a/public_html/img/logo.png b/public_html/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..acbb09c70a79672893682fd3d63ec118c17261a6 GIT binary patch literal 23715 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