some progress in printing system
This commit is contained in:
parent
6ad49b2d12
commit
f43208578d
|
@ -46,4 +46,7 @@ services:
|
|||
arguments: [ "@doctrine.orm.entity_manager" ]
|
||||
registryMGR:
|
||||
class: App\Service\registryMGR
|
||||
arguments: [ "@doctrine.orm.entity_manager" ]
|
||||
Printers:
|
||||
class: App\Service\Printers
|
||||
arguments: [ "@doctrine.orm.entity_manager" ]
|
|
@ -142,4 +142,10 @@ class UiGeneralController extends AbstractController
|
|||
return $this->render('general/repservice.html.twig',);
|
||||
}
|
||||
|
||||
#[Route('/front/apps/hesabixbox', name: 'general_apps_hesabixbox')]
|
||||
public function general_apps_hesabixbox(EntityManagerInterface $entityManager): Response
|
||||
{
|
||||
return $this->render('general/hesabixbox.html.twig',);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
namespace App\Controller;
|
||||
|
||||
use App\Entity\Printer;
|
||||
use App\Entity\PrintItem;
|
||||
use App\Service\Access;
|
||||
use App\Service\Extractor;
|
||||
use App\Service\Log;
|
||||
|
@ -89,4 +90,25 @@ class PrintersController extends AbstractController
|
|||
'result' => 1
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route('/api/print/last', name: 'app_print_last')]
|
||||
public function app_print_last(Provider $provider, Request $request, Access $access, Log $log, EntityManagerInterface $entityManager): Response
|
||||
{
|
||||
$acc = $access->hasRole('owner');
|
||||
if (!$acc)
|
||||
throw $this->createAccessDeniedException();
|
||||
$printer = $entityManager->getRepository(Printer::class)->findBy([
|
||||
'bid' => $acc['bid'],
|
||||
'token'=>$request->headers->get('printer-key')
|
||||
]);
|
||||
$items = $entityManager->getRepository(PrintItem::class)->findBy([
|
||||
'printer' => $printer,
|
||||
'printed' => false
|
||||
]);
|
||||
if(count($items) == 0) return new Response('');
|
||||
$items[count($items) - 1]->setPrinted(true);
|
||||
$entityManager->persist($items[count($items) - 1]);
|
||||
$entityManager->flush();
|
||||
return new Response($items[count($items) - 1]->getType() . ',' .$items[count($items) - 1]->getFile());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ use App\Entity\HesabdariTable;
|
|||
use App\Entity\InvoiceType;
|
||||
use App\Entity\Person;
|
||||
use App\Entity\StoreroomTicket;
|
||||
use App\Service\Printers;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
@ -315,7 +316,7 @@ class SellController extends AbstractController
|
|||
}
|
||||
|
||||
#[Route('/api/sell/posprinter/invoice', name: 'app_sell_posprinter_invoice')]
|
||||
public function app_sell_posprinter_invoice(Provider $provider, Request $request, Access $access, Log $log, EntityManagerInterface $entityManager): JsonResponse
|
||||
public function app_sell_posprinter_invoice(Printers $printers, Provider $provider, Request $request, Access $access, Log $log, EntityManagerInterface $entityManager): JsonResponse
|
||||
{
|
||||
$params = [];
|
||||
if ($content = $request->getContent()) {
|
||||
|
@ -330,9 +331,9 @@ class SellController extends AbstractController
|
|||
'code' => $params['code']
|
||||
]);
|
||||
if (!$doc) throw $this->createNotFoundException();
|
||||
$posPrint = false;
|
||||
if(array_key_exists('posprint',$params)) $posPrint = true;
|
||||
$pid = $provider->createPrint(
|
||||
$pdfPid = 0;
|
||||
if ($params['pdf']) {
|
||||
$pdfPid = $provider->createPrint(
|
||||
$acc['bid'],
|
||||
$this->getUser(),
|
||||
$this->renderView('pdf/posPrinters/sell.html.twig', [
|
||||
|
@ -342,8 +343,38 @@ class SellController extends AbstractController
|
|||
'printInvoice'=>$params['posPrint'],
|
||||
'printcashdeskRecp'=>$params['posPrintRecp'],
|
||||
]),
|
||||
true
|
||||
);
|
||||
return $this->json(['id' => $pid]);
|
||||
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]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,9 @@ class PrintItem
|
|||
#[ORM\Column(nullable: true)]
|
||||
private ?bool $printed = null;
|
||||
|
||||
#[ORM\Column(length: 255)]
|
||||
private ?string $type = null;
|
||||
|
||||
public function getId(): ?int
|
||||
{
|
||||
return $this->id;
|
||||
|
@ -63,4 +66,16 @@ class PrintItem
|
|||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getType(): ?string
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
public function setType(string $type): static
|
||||
{
|
||||
$this->type = $type;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
|
40
hesabixCore/src/Service/Printers.php
Normal file
40
hesabixCore/src/Service/Printers.php
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
use App\Entity\APIToken;
|
||||
use App\Entity\Business;
|
||||
use App\Entity\Permission;
|
||||
use App\Entity\Printer;
|
||||
use App\Entity\PrintItem;
|
||||
use App\Entity\UserToken;
|
||||
use App\Entity\Year;
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\RequestStack;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
||||
|
||||
class Printers
|
||||
{
|
||||
private $em;
|
||||
|
||||
function __construct(EntityManagerInterface $entityManager,){
|
||||
$this->em = $entityManager;
|
||||
}
|
||||
|
||||
public function addFile(string $filename,array $acc,string $type){
|
||||
$printers = $this->em->getRepository(Printer::class)->findBy([
|
||||
'bid'=>$acc['bid']
|
||||
]);
|
||||
foreach($printers as $printer){
|
||||
$item = new PrintItem();
|
||||
$item->setPrinted(false);
|
||||
$item->setPrinter($printer);
|
||||
$item->setType($type);
|
||||
$item->setFile($filename);
|
||||
$this->em->persist($item);
|
||||
}
|
||||
$this->em->flush();
|
||||
}
|
||||
}
|
|
@ -257,6 +257,11 @@
|
|||
<i class="fa fa-fw fa-shop text-primary-lighter me-1"></i>
|
||||
افزونه مدیریت تعمیرگاه</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="fw-semibold" href="{{path('general_apps_hesabixbox')}}">
|
||||
<i class="fa fa-fw fa-shop text-primary-lighter me-1"></i>
|
||||
حسابیکس باکس</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-3">
|
||||
|
|
66
hesabixCore/templates/general/hesabixbox.html.twig
Normal file
66
hesabixCore/templates/general/hesabixbox.html.twig
Normal file
|
@ -0,0 +1,66 @@
|
|||
{% extends "base.html.twig" %}
|
||||
{% block title %}
|
||||
حسابیکس باکس رابط ویندوزی حسابیکس
|
||||
{% endblock %}
|
||||
{% block body %}
|
||||
<main
|
||||
id="main-container p-0 m-0">
|
||||
<!-- Hero -->
|
||||
<div class="bg-image">
|
||||
<div class="bg-black-75">
|
||||
<div class="content content-top content-full text-center">
|
||||
<h1 class="text-white">
|
||||
<i class="fa fa-shop"></i>
|
||||
</h1>
|
||||
<h1 class="fw-bold text-white mt-5 mb-3">حسابیکس باکس رابط ویندوزی حسابیکس</h1>
|
||||
<h2 class="h3 fw-normal text-white-75 mb-5">
|
||||
رابط تحت ویندوز حسابیکس با نام حسابیکس باکس جهت ارتباط با حسابیکس بر روی بستر ویندوز توسعه داده شده است و هماکنون در مرحله آزمایشی قرار دارد.
|
||||
</h2>
|
||||
<a to="#">
|
||||
<a target="_blank" href="https://github.com/morrning/hesabixBox/releases" class="btn btn-primary rounded-pill fs-base px-3 py-2 me-2 m-1">
|
||||
<i class="fa fa-user-circle me-1"></i>
|
||||
دریافت حسابیکس باکس
|
||||
</span>
|
||||
</a>
|
||||
<br>
|
||||
<i class="fa fa-arrow-down text-white"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END Hero -->
|
||||
|
||||
<!-- Page Content -->
|
||||
<div class="container-fluid">
|
||||
<div class="row justify-content-center">
|
||||
<div
|
||||
class="col-sm-11 py-2">
|
||||
<!-- Story -->
|
||||
<article class="story justify-content-between">
|
||||
<div class="rounded-3 bg-white p-3 mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-12">
|
||||
<p>
|
||||
برای اتصال پرینترهای ابری الزاما باید این نرم افزار بر روی رایانه مورد نظر نصب باشد.
|
||||
</p>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<h2 class="text-primary">پیش نیازها:</h2>
|
||||
<ul>
|
||||
<li>
|
||||
Dotnet framework 6 runtime
|
||||
</li>
|
||||
<li>
|
||||
Adobe Acrobat Reader 2010 یا نسخه بالاتر
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</article>
|
||||
<!-- END Story -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END Page Content -->
|
||||
</main>
|
||||
{% endblock %}
|
168
hesabixCore/templates/pdf/posPrinters/cashdesk.html.twig
Normal file
168
hesabixCore/templates/pdf/posPrinters/cashdesk.html.twig
Normal file
|
@ -0,0 +1,168 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fa" direction="rtl">
|
||||
|
||||
<head>
|
||||
<style>
|
||||
body {
|
||||
margin: 5px;
|
||||
padding: 0;
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
tr {
|
||||
width: 100%;
|
||||
}
|
||||
th,
|
||||
td {
|
||||
border: 1px solid black !important;
|
||||
}
|
||||
h1 {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#logo {
|
||||
width: 60%;
|
||||
text-align: center;
|
||||
-webkit-align-content: center;
|
||||
align-content: center;
|
||||
padding: 5px;
|
||||
margin: 0 auto;
|
||||
display: block;
|
||||
}
|
||||
|
||||
header {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
-webkit-align-content: center;
|
||||
align-content: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.items thead {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.center-align {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.bill-details td {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.receipt {
|
||||
font-size: medium;
|
||||
}
|
||||
|
||||
.items .heading {
|
||||
font-size: 12.5px;
|
||||
text-transform: uppercase;
|
||||
border-top: 1px solid black;
|
||||
margin-bottom: 4px;
|
||||
border-bottom: 1px solid black;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.items thead tr th:first-child,
|
||||
.items tbody tr td:first-child {
|
||||
word-break: break-all;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.items td {
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.price::after {
|
||||
content: "";
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.sum-up {
|
||||
text-align: right !important;
|
||||
}
|
||||
.total {
|
||||
font-size: 13px;
|
||||
border-top: 1px dashed black !important;
|
||||
border-bottom: 1px dashed black !important;
|
||||
}
|
||||
.total.text,
|
||||
.total.price {
|
||||
text-align: right;
|
||||
}
|
||||
.total.price::after {
|
||||
content: " ریال ";
|
||||
}
|
||||
.line {
|
||||
border-top: 1px solid black !important;
|
||||
}
|
||||
|
||||
p {
|
||||
padding: 1px;
|
||||
margin: 0;
|
||||
}
|
||||
section,
|
||||
footer {
|
||||
font-size: 12px;
|
||||
}
|
||||
tbody,
|
||||
thead,
|
||||
th,
|
||||
td,
|
||||
tr {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body style="direction:rtl; text-align:right; width:100%">
|
||||
<table class="bill-details">
|
||||
<tbody style="text-align:right">
|
||||
<tr>
|
||||
<td style="text-align:right">تاریخ :
|
||||
<span>{{doc.date}}</span>
|
||||
</td>
|
||||
<td style="text-align:right">شماره :
|
||||
<span>#
|
||||
{{doc.code | number_format}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="center-align" colspan="2">
|
||||
<span class="receipt">قبض صندوق</span>
|
||||
</th>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="items">
|
||||
<thead style="background:gray;text-color:white;">
|
||||
<tr>
|
||||
<th class="heading name">کالا</th>
|
||||
<th class="heading qty">تعداد</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
{% for row in rows %}
|
||||
{% if row.commodity != null %}
|
||||
<tr>
|
||||
<td>{{row.commodity.name}}</td>
|
||||
<td>{{row.commdityCount}}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<footer style="text-align:center">
|
||||
<p>{{ bid.name }}</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
186
hesabixCore/templates/pdf/posPrinters/justSell.html.twig
Normal file
186
hesabixCore/templates/pdf/posPrinters/justSell.html.twig
Normal file
|
@ -0,0 +1,186 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fa" direction="rtl">
|
||||
|
||||
<head>
|
||||
<style>
|
||||
body {
|
||||
margin: 5px;
|
||||
padding: 0;
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
tr {
|
||||
width: 100%;
|
||||
}
|
||||
th,
|
||||
td {
|
||||
border: 1px solid black !important;
|
||||
}
|
||||
h1 {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#logo {
|
||||
width: 60%;
|
||||
text-align: center;
|
||||
-webkit-align-content: center;
|
||||
align-content: center;
|
||||
padding: 5px;
|
||||
margin: 0 auto;
|
||||
display: block;
|
||||
}
|
||||
|
||||
header {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
-webkit-align-content: center;
|
||||
align-content: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.items thead {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.center-align {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.bill-details td {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.receipt {
|
||||
font-size: medium;
|
||||
}
|
||||
|
||||
.items .heading {
|
||||
font-size: 12.5px;
|
||||
text-transform: uppercase;
|
||||
border-top: 1px solid black;
|
||||
margin-bottom: 4px;
|
||||
border-bottom: 1px solid black;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.items thead tr th:first-child,
|
||||
.items tbody tr td:first-child {
|
||||
word-break: break-all;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.items td {
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
.price::after {
|
||||
content: "";
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.sum-up {
|
||||
text-align: right !important;
|
||||
}
|
||||
.total {
|
||||
font-size: 13px;
|
||||
border-top: 1px dashed black !important;
|
||||
border-bottom: 1px dashed black !important;
|
||||
}
|
||||
.total.text,
|
||||
.total.price {
|
||||
text-align: right;
|
||||
}
|
||||
.total.price::after {
|
||||
content: " ریال ";
|
||||
}
|
||||
.line {
|
||||
border-top: 1px solid black !important;
|
||||
}
|
||||
|
||||
p {
|
||||
padding: 1px;
|
||||
margin: 0;
|
||||
}
|
||||
section,
|
||||
footer {
|
||||
font-size: 12px;
|
||||
}
|
||||
tbody,
|
||||
thead,
|
||||
th,
|
||||
td,
|
||||
tr {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body style="direction:rtl; text-align:right; width:100%">
|
||||
<header>
|
||||
<p style="text-align:center;">{{ bid.name }}</p>
|
||||
</header>
|
||||
<table class="bill-details">
|
||||
<tbody style="text-align:right">
|
||||
<tr>
|
||||
<td style="text-align:right">تاریخ :
|
||||
<span>{{doc.date}}</span>
|
||||
</td>
|
||||
<td style="text-align:right">شماره :
|
||||
<span>#
|
||||
{{doc.code | number_format}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="center-align" colspan="2">
|
||||
<span class="receipt">صورتحساب</span>
|
||||
</th>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table class="items">
|
||||
<thead style="background:gray;text-color:white;">
|
||||
<tr>
|
||||
<th class="heading name">کالا</th>
|
||||
<th class="heading qty">تعداد</th>
|
||||
<th class="heading rate">فی</th>
|
||||
<th class="heading amount">جمع</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
{% for row in rows %}
|
||||
{% if row.commodity != null %}
|
||||
<tr>
|
||||
<td>{{row.commodity.name}}</td>
|
||||
<td>{{row.commdityCount}}</td>
|
||||
<td class="price">{{(row.bs / row.commdityCount) | number_format}}</td>
|
||||
<td class="price">{{row.bs | number_format}}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<tr>
|
||||
<th colspan="3" class="total text">جمع فاکتور</th>
|
||||
<th class="total price">{{doc.amount | number_format}}</th>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<section style="margin-bottom:10px;margin-top:10px;text-align:center;">
|
||||
<b style="text-align:center">
|
||||
از خرید شما متشکریم
|
||||
</b>
|
||||
</section>
|
||||
<footer style="text-align:center">
|
||||
<p>{{ bid.address }}</p>
|
||||
<p>{{ bid.tel }}</p>
|
||||
<p>hesabix.ir</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fa" direction="rtl"></html>
|
||||
|
||||
<head>
|
||||
<style>
|
||||
body {
|
||||
|
@ -185,7 +184,8 @@
|
|||
|
||||
{% if printcashdeskRecp%}
|
||||
{% if printInvoice %}
|
||||
<hr>
|
||||
<pagebreak>
|
||||
|
||||
{% endif %}
|
||||
<table class="bill-details">
|
||||
<tbody style="text-align:right">
|
||||
|
@ -229,8 +229,6 @@
|
|||
<p>{{ bid.name }}</p>
|
||||
</footer>
|
||||
{% endif %}
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
|
Loading…
Reference in a new issue