'Zaokrouhlení', 1 => 'Zaplaceno v hotovosti', 2 => 'Zaplaceno kartou', 3 => 'Zadáno na fakturu', 4 => 'Vloženo do kasy', 5 => 'Vybráno z kasy', 6 => 'Zaplaceno převodem', 7 => 'Zaplaceno dobírkou', 8 => 'Zaplaceno online', 9 => 'Vyrovnání pokladny', 101 => 'SK EET Úhrada faktury - hotově', 102 => 'SK EET Úhrada faktury - kartou', ]; public function __construct() { $this->sum = DecimalConstants::zero(); } public function getPayments() { $stats = []; $vats = $this->getQueryBuilder()->select('*')->from('vats'); if (findModule(\Modules::OSS_VATS)) { $vats->andWhere(Operator::equals(['automanaged' => 0])); } foreach ($vats->execute()->fetchAll() as $vat) { $stats[Payment::METHOD_CASH][$vat['vat']] = $this->getSumByVat(Payment::METHOD_CASH, $vat['vat']); $stats[Payment::METHOD_CARD][$vat['vat']] = $this->getSumByVat(Payment::METHOD_CARD, $vat['vat']); $stats[Payment::METHOD_INVOICE][$vat['vat']] = $this->getSumByVat(Payment::METHOD_INVOICE, $vat['vat']); } $stats[Payment::METHOD_CASH_INSERTION] = $this->getSum(Payment::METHOD_CASH_INSERTION); $this->sum = $this->sum->sub($stats[Payment::METHOD_CASH_INSERTION]); $stats[Payment::METHOD_CASH_SELECTION] = $this->getSum(Payment::METHOD_CASH_SELECTION); $this->sum = $this->sum->sub($stats[Payment::METHOD_CASH_INSERTION]); $stats[Payment::METHOD_COMPENSATION] = $this->getSum(Payment::METHOD_COMPENSATION); $stats[0] = &$this->sum; return $stats; } protected function getSumByVat($method, $vat) { $qb = $this->getQueryBuilder() ->select('DISTINCT (oi.id)') ->from('order_items', 'oi') ->leftJoin('oi', 'order_payments', 'op', 'oi.id_order = op.id_order') ->andWhere( $this->getQueryBuilder()->expr()->eq('op.method', $method) ) ->andWhere( $this->getQueryBuilder()->expr()->eq('oi.tax', $vat) ); $this->addDates($qb); $this->selectPOS($qb); $qb2 = $this->getQueryBuilder() ->select('SUM(oi2.total_price)') ->from('order_items', 'oi2') ->where( $this->getQueryBuilder()->expr()->in('oi2.id', $qb->getSQL()) ) ->setParameters($qb->getParameters()); $qr = $qb2->execute(); $val = $qr->fetchColumn(); $this->sum = $this->sum->sub(toDecimal($val)->addVat($vat)); return toDecimal($val); } protected function getSum($method) { $qb = $this->getQueryBuilder() ->select('SUM(price) as sum') ->from('order_payments', 'op') ->andWhere( $this->getQueryBuilder()->expr()->eq('op.method', $method) ); $this->addDates($qb); $this->selectPOS($qb); $qr = $qb->execute(); $val = $qr->fetchColumn(); return toDecimal($val); } public function getActuallyCashInPOS() { $qb = $this->getQueryBuilder() ->select('SUM(price) as sum') ->from('order_payments', 'op') ->andWhere( $this->getQueryBuilder()->expr()->orX( $this->getQueryBuilder()->expr()->eq('method', ':cash'), $this->getQueryBuilder()->expr()->eq('method', ':selection'), $this->getQueryBuilder()->expr()->eq('method', ':insertion'), $this->getQueryBuilder()->expr()->eq('method', ':compensation') ) ) ->setParameters([ 'cash' => Payment::METHOD_CASH, 'selection' => Payment::METHOD_CASH_SELECTION, 'insertion' => Payment::METHOD_CASH_INSERTION, 'compensation' => Payment::METHOD_COMPENSATION, ]); if ($this->getEndDatetime()) { $qb->andWhere('op.date < :end_datetime') ->setParameter('end_datetime', $this->getEndDatetime()); } $this->selectPOS($qb); $qr = $qb->execute(); return toDecimal($qr->fetchColumn()); } public function getSales() { $qb = $this->getQueryBuilder() ->select('SUM(price)') ->from('order_payments', 'op') ->andWhere( $this->getQueryBuilder()->expr()->orX( $this->getQueryBuilder()->expr()->eq('method', ':cash'), $this->getQueryBuilder()->expr()->eq('method', ':card'), $this->getQueryBuilder()->expr()->eq('method', ':invoice') ) ) ->setParameters([ 'cash' => Payment::METHOD_CASH, 'card' => Payment::METHOD_CARD, 'invoice' => Payment::METHOD_INVOICE, ]); $this->addDates($qb); $this->selectPOS($qb); $qr = $qb->execute(); $val = $qr->fetchColumn(); $this->sum = $this->sum->add(toDecimal($val)); return toDecimal($val); } public function getDiscounts() { $qb = $this->getQueryBuilder() ->select('DISTINCT (oi.id)') ->from('order_items', 'oi') ->leftJoin('oi', 'order_payments', 'op', 'oi.id_order = op.id_order'); $this->addDates($qb); $this->selectPOS($qb); $qb2 = $this->getQueryBuilder() ->select('SUM(((oi2.total_price / (100) * (100 + oi2.tax)) / (100 - oi2.discount) * oi2.discount))') ->from('order_items', 'oi2') ->where( $this->getQueryBuilder()->expr()->in('oi2.id', $qb->getSQL()) ) ->setParameters($qb->getParameters()); $qr = $qb2->execute(); $val = $qr->fetchColumn(); return toDecimal($val); } protected function selectPOS(&$qb) { if ($this->getSpecificPos()) { $qb->andWhere($this->getQueryBuilder()->expr()->eq('op.admin', $this->getSpecificPos())); } } protected function addDates(&$qb) { if ($this->getStartDatetime()) { $qb->andWhere('op.date > :start_datetime') ->setParameter('start_datetime', $this->getStartDatetime()); } if ($this->getEndDatetime()) { $qb->andWhere('op.date < :end_datetime') ->setParameter('end_datetime', $this->getEndDatetime()); } } public static function getMethodDescr($method_id) { return static::METHODS[$method_id]; } /** * @param mixed $start_datetime In format %d-%m-%Y %H:%M:%S */ public function setStartDatetime($start_datetime) { $this->start_datetime = $this->prepareDateTime($start_datetime); } /** * @param mixed $end_datetime In format %d-%m-%Y %H:%M:%S */ public function setEndDatetime($end_datetime) { $this->end_datetime = $this->prepareDateTime($end_datetime); } public function getStartDatetime() { return $this->start_datetime; } public function getEndDatetime() { return $this->end_datetime; } public function getSpecificPos() { return $this->specific_pos; } /** * @param null $specific_pos */ public function setSpecificPos($specific_pos) { $this->specific_pos = $specific_pos; } } if (empty($subclass)) { class Pos extends PosBase { } }