예제 #1
0
 static function delete($id)
 {
     $pdo = PDOBuilder::getPDO();
     $db = DB::get();
     $ticket = TicketsService::get($id);
     if ($ticket === null) {
         return false;
     }
     $cashSrv = new CashesService();
     $cash = $cashSrv->get($ticket->cashId);
     if ($cash === null || $cash->isClosed()) {
         return false;
     }
     $cashRegSrv = new CashRegistersService();
     $cashReg = $cashRegSrv->getFromCashId($cash->id);
     // As cash must be opened, cashregister location is considered accurate
     $locationId = $cashReg->locationId;
     $newTransaction = !$pdo->inTransaction();
     if ($newTransaction) {
         $pdo->beginTransaction();
     }
     // Delete ticket lines
     // Also check for prepayments refill
     $stmtLines = $pdo->prepare("DELETE FROM TICKETLINES " . "WHERE TICKET = :id");
     $stmtLines->bindParam(":id", $ticket->id);
     foreach ($ticket->lines as $line) {
         // Update stock
         if ($line->productId !== null) {
             $discountRate = $ticket->discountRate;
             $fullDiscount = $discountRate + $line->discountRate;
             $discountPrice = $line->price * (1.0 - $fullDiscount);
             $move = new StockMove($ticket->date, StockMove::REASON_IN_REFUND, $line->productId, $locationId, $line->attrSetInstId, $line->quantity, $discountPrice);
             if (StocksService::addMove($move) === false) {
                 if ($newTransaction) {
                     $pdo->rollback();
                 }
                 return false;
             }
         }
         // Check prepayment refill
         // Refill is not affected by discount
         $prepaidIds = ProductsService::getPrepaidIds();
         if ($ticket->customerId !== null && in_array($line->productId, $prepaidIds)) {
             $custSrv = new CustomersService();
             $ok = $custSrv->addPrepaid($ticket->customerId, -$line->price * $line->quantity);
             if ($ok === false) {
                 if ($newTransaction) {
                     $pdo->rollback();
                 }
                 return false;
             }
         }
     }
     if ($stmtLines->execute() === false) {
         if ($newTransaction) {
             $pdo->rollback();
         }
         return false;
     }
     // Delete payments
     // Also check for prepayment debit and debt
     $stmtPay = $pdo->prepare("DELETE FROM PAYMENTS WHERE RECEIPT = :id");
     $stmtPay->bindParam(":id", $ticket->id);
     foreach ($ticket->payments as $payment) {
         if ($payment->type == 'prepaid' || $payment->type == 'debt') {
             $custSrv = new CustomersService();
             if ($payment->type == 'prepaid') {
                 $ok = $custSrv->addPrepaid($ticket->customerId, $payment->amount);
             } else {
                 $ok = $custSrv->recoverDebt($ticket->customerId, $payment->amount);
             }
             if ($ok === false) {
                 if ($newTransaction) {
                     $pdo->rollback();
                 }
                 return false;
             }
         }
     }
     if ($stmtPay->execute() === false) {
         if ($newTransaction) {
             $pdo->rollback();
         }
         return false;
     }
     // Delete taxlines
     $stmtTax = $pdo->prepare("DELETE FROM TAXLINES WHERE RECEIPT = :id");
     $stmtTax->bindParam(":id", $ticket->id);
     if ($stmtTax->execute() === false) {
         if ($newTransaction) {
             $pdo->rollback();
         }
         return false;
     }
     //  Delete ticket
     $discountRate = $ticket->discountRate;
     $stmtTkt = $pdo->prepare("DELETE FROM TICKETS WHERE ID = :id");
     $stmtTkt->bindParam(':id', $ticket->id);
     if ($stmtTkt->execute() === false) {
         if ($newTransaction) {
             $pdo->rollback();
         }
         return false;
     }
     // Delete receipt
     $stmtRcpt = $pdo->prepare("DELETE FROM RECEIPTS WHERE ID = :id");
     $stmtRcpt->bindParam(":id", $ticket->id);
     if ($stmtRcpt->execute() === false) {
         if ($newTransaction) {
             $pdo->rollback();
         }
         return false;
     }
     if ($newTransaction) {
         $pdo->commit();
     }
     return true;
 }
예제 #2
0
 protected function proceed()
 {
     $srv = new CustomersService();
     switch ($this->action) {
         case 'get':
             $this->succeed($srv->get($this->params['id']));
             break;
         case 'getAll':
             $this->succeed($srv->getAll());
             break;
         case 'addPrepaid':
             $this->succeed($srv->addPrepaid($this->params['id'], $this->params['amount']));
             break;
         case 'getTop':
             $this->succeed($srv->getTop($this->getParam("limit")));
             break;
         case 'save':
             // Convert single customer to array for consistency
             if ($this->isParamSet('customers')) {
                 $json = json_decode($this->params['customers']);
             } else {
                 $json = array(json_decode($this->params['customer']));
             }
             $srv = new CustomersService();
             $result = array();
             // Begin transaction
             $pdo = PDOBuilder::getPDO();
             if (!$pdo->beginTransaction()) {
                 $this->fail(APIError::$ERR_GENERIC);
                 break;
             }
             foreach ($json as $customer) {
                 if (isset($customer->id) && $customer->id !== null) {
                     // Edit
                     if (!$srv->update($customer)) {
                         // Error, rollback
                         $pdo->rollback();
                         $this->fail(APIError::$ERR_GENERIC);
                         return;
                     } else {
                         $result[] = $customer->id;
                     }
                 } else {
                     // Create
                     $id = $srv->create($customer);
                     if ($id !== false) {
                         $result[] = $id;
                     } else {
                         // Error, rollback
                         $pdo->rollback();
                         $this->fail(APIError::$ERR_GENERIC);
                         return;
                     }
                 }
             }
             // Success, commit
             if ($pdo->commit()) {
                 $this->succeed(array("saved" => $result));
             } else {
                 $this->fail(APIError::$ERR_GENERIC);
             }
             break;
     }
 }