protected function SetupAssetTransaction() { // Lookup Object PK information from Query String (if applicable) // Set mode to Edit or New depending on what's found $intAssetTransactionId = QApplication::QueryString('intAssetTransactionId'); if ($intAssetTransactionId) { $this->objAssetTransaction = AssetTransaction::Load($intAssetTransactionId); if (!$this->objAssetTransaction) { throw new Exception('Could not find a AssetTransaction object with PK arguments: ' . $intAssetTransactionId); } $this->strTitleVerb = QApplication::Translate('Edit'); $this->blnEditMode = true; } else { $this->objAssetTransaction = new AssetTransaction(); $this->strTitleVerb = QApplication::Translate('Create'); $this->blnEditMode = false; } }
public function btnSave_Click($strFormId, $strControlId, $strParameter) { $blnError = false; if ($this->objAssetTransactionArray && $this->objInventoryTransactionArray) { $intEntityQtypeId = EntityQtype::AssetInventory; } elseif ($this->objAssetTransactionArray) { $intEntityQtypeId = EntityQtype::Asset; } elseif ($this->objInventoryTransactionArray) { $intEntityQtypeId = EntityQtype::Inventory; } else { $blnError = true; $this->btnCancel->Warning = 'There are no assets nor inventory in this receipt.'; } if (QApplication::$TracmorSettings->CustomReceiptNumbers) { if (trim($this->txtReceiptNumber->Text) == '') { $blnError = true; $this->txtReceiptNumber->Warning = 'Receipt number is a required field.'; } else { if ($objReceipt = Receipt::LoadByReceiptNumber($this->txtReceiptNumber->Text)) { if ($objReceipt->ReceiptId != $this->objReceipt->ReceiptId) { $blnError = true; $this->txtReceiptNumber->Warning = 'That is a duplicate receipt number.'; } } } } if (!$this->lstFromCompany->SelectedValue) { $blnError = true; $this->lstFromCompany->Warning = 'You must select a From Company'; } if (!$this->lstFromContact->SelectedValue) { $blnError = true; $this->lstFromContact->Warning = 'You must select a From Contact'; } if (!$this->lstToContact->SelectedValue) { $blnError = true; $this->lstToContact->Warning = 'You must select a To Contact'; } if (!$this->lstToAddress->SelectedValue) { $blnError = true; $this->lstToAddress->Warning = 'You must select a To Address'; } if (!$blnError) { if (!$this->blnEditMode) { try { // Get an instance of the database $objDatabase = QApplication::$Database[1]; // Begin a MySQL Transaction to be either committed or rolled back $objDatabase->TransactionBegin(); // Create the new transaction object and save it $this->objTransaction = new Transaction(); $this->objTransaction->EntityQtypeId = $intEntityQtypeId; $this->objTransaction->TransactionTypeId = 7; // Receive $this->objTransaction->Note = $this->txtNote->Text; $this->objTransaction->Save(); if ($intEntityQtypeId == EntityQtype::AssetInventory || $intEntityQtypeId == EntityQtype::Asset) { // Assign different source and destinations depending on transaction type foreach ($this->objAssetTransactionArray as $objAssetTransaction) { // Save the asset just to update the modified_date field so it can trigger an Optimistic Locking Exception when appropriate if ($objAssetTransaction->Asset instanceof Asset) { // Save the asset to update the modified_date field so it can trigger an Optimistic Locking Exception when appropriate // Also set the location to 5 (TBR). This is in case the current LocationId is 2 (Shipped), because they can be received. $objAssetTransaction->Asset->LocationId = 5; // If the AssetId==0, then it is a newly created asset that hasn't been saved to the db yet // We have to create a new asset object and assign it to the AssetTransaction // Just resetting the values for the existing asset object won't work for some reason (not sure why). if ($objAssetTransaction->Asset->AssetId == 0) { $objNewAsset = new Asset(); $objNewAsset->AssetModelId = $objAssetTransaction->Asset->AssetModelId; $objNewAsset->TempId = $objAssetTransaction->Asset->TempId; $objNewAsset->LocationId = $objAssetTransaction->Asset->LocationId; // If the asset was selected for autogeneration, it will be blank, so create the asset code here (right before save) if ($objAssetTransaction->Asset->AssetCode == '') { $objAssetTransaction->Asset->AssetCode = Asset::GenerateAssetCode(); } $objNewAsset->AssetCode = $objAssetTransaction->Asset->AssetCode; // Save the new asset $objNewAsset->Save(); // Assign any default custom field values CustomField::AssignNewEntityDefaultValues(1, $objNewAsset->AssetId); // Assign the new asset to the AssetTransaction $objAssetTransaction->Asset = $objNewAsset; $objAssetTransaction->NewAssetFlag = true; } else { $objAssetTransaction->NewAssetFlag = false; $objAssetTransaction->Asset->Save(); } // Create the new assettransaction object and save it $objAssetTransaction->TransactionId = $this->objTransaction->TransactionId; $objAssetTransaction->Save(); } } } if ($intEntityQtypeId == EntityQtype::AssetInventory || $intEntityQtypeId == EntityQtype::Inventory) { // Assign different source and destinations depending on transaction type foreach ($this->objInventoryTransactionArray as &$objInventoryTransaction) { // Finish the InventoryTransaction and save it $objInventoryTransaction->InventoryLocation->Quantity += $objInventoryTransaction->Quantity; $objInventoryTransaction->InventoryLocation->Save(); $objInventoryTransaction->TransactionId = $this->objTransaction->TransactionId; $objInventoryTransaction->Save(); } } $this->UpdateReceiptFields(); $this->objReceipt->ReceivedFlag = false; $this->objReceipt->Save(); if ($this->arrCustomFields) { // Save the values from all of the custom field controls to save the shipment CustomField::SaveControls($this->objReceipt->objCustomFieldArray, $this->blnEditMode, $this->arrCustomFields, $this->objReceipt->ReceiptId, EntityQtype::Receipt); } $objDatabase->TransactionCommit(); QApplication::Redirect('receipt_list.php'); } catch (QExtendedOptimisticLockingException $objExc) { // Rollback the database $objDatabase->TransactionRollback(); if ($objExc->Class == 'Asset') { // $this->btnRemoveAssetTransaction_Click($this->FormId, 'btnRemoveAsset' . $objExc->EntityId, $objExc->EntityId); $this->btnRemoveAssetTransaction_Click($this->FormId, null, $objExc->EntityId); $objAsset = Asset::Load($objExc->EntityId); if ($objAsset) { $this->btnCancel->Warning = sprintf('The Asset %s has been modified by another user and removed from this shipment. You may add the asset again or save the transaction without it.', $objAsset->AssetCode); } else { $this->btnCancel->Warning = 'An Asset has been deleted by another user and removed from this shipment.'; } } if ($objExc->Class == 'AssetTransaction') { $this->btnCancel->Warning = 'This asset transaction has been modified by another user. You may reload the receipt and try your modifications again.'; } if ($objExc->Class == 'InventoryLocation') { $this->btnRemoveInventory_Click($this->FormId, 'btnRemoveInventory' . $objExc->EntityId, $objExc->EntityId); $objInventoryLocation = InventoryLocation::Load($objExc->EntityId); if ($objInventoryLocation) { $this->btnCancel->Warning = sprintf('The Inventory %s has been modified by another user and removed from this shipment. You may add the inventory again or save the shipment without it.', $objInventoryLocation->InventoryModel->InventoryModelCode); } else { $this->btnCancel->Warning = 'Inventory has been deleted by another user and removed from this shipment.'; } } } } elseif ($this->blnEditMode) { try { // Get an instance of the database $objDatabase = QApplication::$Database[1]; // Begin a MySQL Transaction to be either committed or rolled back $objDatabase->TransactionBegin(); // This should probably be changed to $this->objReceipt->Transaction $this->objTransaction = Transaction::Load($this->objReceipt->TransactionId); $this->objTransaction->EntityQtypeId = $intEntityQtypeId; $this->objTransaction->Note = $this->txtNote->Text; $this->objTransaction->Save(); // Remove AssetTransactions that were removed when editing if ($this->arrAssetTransactionToDelete) { foreach ($this->arrAssetTransactionToDelete as $intAssetTransactionId) { $objAssetTransactionToDelete = AssetTransaction::Load($intAssetTransactionId); // Make sure that it wasn't added and then removed if ($objAssetTransactionToDelete) { // If a new asset was created in this receipt, it needs to be deleted if ($objAssetTransactionToDelete->NewAssetFlag) { $intAssetIdToDelete = $objAssetTransactionToDelete->Asset->AssetId; //$objAssetTransactionToDelete->Asset->Delete(); } else { // Change back location $objAssetTransactionToDelete->Asset->LocationId = $objAssetTransactionToDelete->SourceLocationId; $objAssetTransactionToDelete->Asset->Save(); } // Delete the asset transaction $objAssetTransactionToDelete->Delete(); // If a new asset, delete it if (isset($intAssetIdToDelete)) { $objAssetToDelete = Asset::LoadByAssetId($intAssetIdToDelete); $objAssetToDelete->Delete(); } unset($objAssetTransactionToDelete); } } } // Save existing AssetTransactions if ($this->objAssetTransactionArray) { foreach ($this->objAssetTransactionArray as $objAssetTransaction) { if (!$objAssetTransaction->AssetTransactionId) { $objAssetTransaction->TransactionId = $this->objTransaction->TransactionId; // This is done in case the original location is 'Shipped'(2), not 'To Be Received'(5) $objAssetTransaction->SourceLocationId = $objAssetTransaction->Asset->LocationId; $objAssetTransaction->Asset->LocationId = 5; // To Be Received // If the AssetId is 0 (it hasn't been saved to the database yet), then create a new Asset in the conventional way // We have to create a new asset object and assign it to the AssetTransaction // Just resetting the values for the existing asset object won't work for some reason (not sure why). if ($objAssetTransaction->Asset->AssetId == 0) { $objNewAsset = new Asset(); $objNewAsset->AssetModelId = $objAssetTransaction->Asset->AssetModelId; $objNewAsset->TempId = $objAssetTransaction->Asset->TempId; $objNewAsset->LocationId = $objAssetTransaction->Asset->LocationId; // If the asset was selected for autogeneration, it will be blank, so create the asset code here (right before save) if ($objAssetTransaction->Asset->AssetCode == '') { $objAssetTransaction->Asset->AssetCode = Asset::GenerateAssetCode(); } $objNewAsset->AssetCode = $objAssetTransaction->Asset->AssetCode; // Save the new asset $objNewAsset->Save(); // Assign any default custom field values CustomField::AssignNewEntityDefaultValues(1, $objNewAsset->AssetId); // Associate the new asset with the AssetTransaction $objAssetTransaction->Asset = $objNewAsset; $objAssetTransaction->NewAssetFlag = true; } else { $objAssetTransaction->NewAssetFlag = false; $objAssetTransaction->Asset->Save(); } } // Always save the asset transaction, to generate an Optimistic Locking Exception when appropriate $objAssetTransaction->Save(); // Reload AssetTransaction to avoid Optimistic Locking Exception if this receipt is edited and saved. $objAssetTransaction = AssetTransaction::Load($objAssetTransaction->AssetTransactionId); } } // Remove InventoryTransactions if ($this->arrInventoryTransactionToDelete) { foreach ($this->arrInventoryTransactionToDelete as $intInventoryTransactionId) { $objInventoryTransactionToDelete = InventoryTransaction::Load($intInventoryTransactionId); // Make sure that it wasn't added then removed if ($objInventoryTransactionToDelete) { // Change back the quantity $objInventoryTransactionToDelete->InventoryLocation->Quantity -= $objInventoryTransactionToDelete->Quantity; $objInventoryTransactionToDelete->InventoryLocation->Save(); // Delete the InventoryTransaction $objInventoryTransactionToDelete->Delete(); unset($objInventoryTransactionToDelete); } } } // Save InventoryTransactions if ($this->objInventoryTransactionArray) { foreach ($this->objInventoryTransactionArray as $objInventoryTransaction) { if (!$objInventoryTransaction->InventoryTransactionId) { // Reload the InventoryLocation. If it was deleted and added in the same save click, then it will throw an Optimistic Locking Exception $objInventoryTransaction->InventoryLocation = InventoryLocation::Load($objInventoryTransaction->InventoryLocationId); $objInventoryTransaction->InventoryLocation->Quantity += $objInventoryTransaction->Quantity; $objInventoryTransaction->TransactionId = $this->objTransaction->TransactionId; $objInventoryTransaction->InventoryLocation->Save(); $SourceLocationId = 5; // To Be Received $objInventoryTransaction->SourceLocationId = $SourceLocationId; } // Always save the InventoryTransaction, to generate an Optimistic Locking Exception when appropriate $objInventoryTransaction->Save(); // Reload the InventoryTransaction to get the new timestamp so that it doesn't generate an optimistic locking exception $objInventoryTransaction = InventoryTransaction::Load($objInventoryTransaction->InventoryTransactionId); } } // Check to see if all Inventory and Assets have been received (if the final entity was removed from the receipt without receiving it). // Only if it hasn't already been received if (!$this->objReceipt->ReceivedFlag) { // Check to see if all assets have been received $blnAllAssetsReceived = true; if ($this->objAssetTransactionArray) { foreach ($this->objAssetTransactionArray as $objAssetTransaction) { if (!$objAssetTransaction->DestinationLocationId) { $blnAllAssetsReceived = false; } } } // Check to see if all inventory have been received $blnAllInventoryReceived = true; if ($this->objInventoryTransactionArray) { foreach ($this->objInventoryTransactionArray as $objInventoryTransaction) { if (!$objInventoryTransaction->DestinationLocationId) { $blnAllInventoryReceived = false; } } } // If all Inventory and Assets have been received if ($blnAllAssetsReceived && $blnAllInventoryReceived) { // Flip the received flag for the entire Receipt $this->objReceipt->ReceivedFlag = true; $this->objReceipt->ReceiptDate = new QDateTime(QDateTime::Now); } } else { if ($this->objReceipt->ReceiptDate != $this->calDateReceived->DateTime) { $this->objReceipt->ReceiptDate = $this->calDateReceived->DateTime; } } $this->UpdateReceiptFields(); $this->UpdateReceiptLabels(); $this->objReceipt->Save(); if ($this->arrCustomFields) { // Save the values from all of the custom field controls to save the shipment CustomField::SaveControls($this->objReceipt->objCustomFieldArray, $this->blnEditMode, $this->arrCustomFields, $this->objReceipt->ReceiptId, EntityQtype::Receipt); } // Reload to get new timestamp to avoid optimistic locking if edited/saved again without reload $this->objReceipt = Receipt::Load($this->objReceipt->ReceiptId); $this->DisplayLabels(); $objDatabase->TransactionCommit(); } catch (QExtendedOptimisticLockingException $objExc) { $objDatabase->TransactionRollback(); if ($objExc->Class == 'Receipt' || $objExc->Class == 'AssetTransaction' || $objExc->Class == 'InventoryTransaction') { $this->btnCancel->Warning = sprintf('This receipt has been modified by another user. You must <a href="receipt_edit.php?intReceiptId=%s">Refresh</a> to edit this receipt.', $this->objReceipt->ReceiptId); } elseif ($objExc->Class == 'Asset') { // $this->btnRemoveAssetTransaction_Click($this->FormId, 'btnRemoveAsset' . $objExc->EntityId, $objExc->EntityId); $this->btnRemoveAssetTransaction_Click($this->FormId, null, $objExc->EntityId); $objAsset = Asset::Load($objExc->EntityId); if ($objAsset) { $this->btnCancel->Warning = sprintf('The Asset %s has been modified by another user and removed from this shipment. You may add the asset again or save the transaction without it.', $objAsset->AssetCode); } else { $this->btnCancel->Warning = 'An Asset has been deleted by another user and removed from this shipment.'; } } elseif ($objExc->Class == 'InventoryLocation') { $this->btnRemoveInventory_Click($this->FormId, 'btnRemoveInventory' . $objExc->EntityId, $objExc->EntityId); $objInventoryLocation = InventoryLocation::Load($objExc->EntityId); if ($objInventoryLocation) { $this->btnCancel->Warning = sprintf('The Inventory %s has been modified by another user and removed from this shipment. You may add the inventory again or save the shipment without it.', $objInventoryLocation->InventoryModel->InventoryModelCode); } else { $this->btnCancel->Warning = 'Inventory has been deleted by another user and removed from this shipment.'; } } else { throw new QOptimisticLockingException($objExc->Class); } } } } }
protected function btnSave_Click($strFormId, $strControlId, $strParameter) { $blnError = false; if ($this->objAssetTransactionArray && $this->objInventoryTransactionArray) { $intEntityQtypeId = EntityQtype::AssetInventory; } elseif ($this->objAssetTransactionArray) { $intEntityQtypeId = EntityQtype::Asset; } elseif ($this->objInventoryTransactionArray) { $intEntityQtypeId = EntityQtype::Inventory; } else { $blnError = true; $this->btnCancel->Warning = 'There are no assets or inventory in this shipment.'; } if (QApplication::$TracmorSettings->CustomShipmentNumbers) { if ($objShipment = Shipment::LoadByShipmentNumber($this->txtShipmentNumber->Text)) { if ($objShipment->ShipmentId != $this->objShipment->ShipmentId) { $blnError = true; $this->txtShipmentNumber->Warning = 'That is a duplicate shipment number.'; } } } if (!$blnError) { if (!$this->blnEditMode) { try { // Get an instance of the database $objDatabase = QApplication::$Database[1]; // Begin a MySQL Transaction to be either committed or rolled back $objDatabase->TransactionBegin(); // Create the new transaction object and save it $this->objTransaction = new Transaction(); $this->objTransaction->EntityQtypeId = $intEntityQtypeId; $this->objTransaction->TransactionTypeId = 6; $this->objTransaction->Note = $this->txtNote->Text; $this->objTransaction->Save(); if ($intEntityQtypeId == EntityQtype::AssetInventory || $intEntityQtypeId == EntityQtype::Asset) { // Assign different source and destinations depending on transaction type foreach ($this->objAssetTransactionArray as $objAssetTransaction) { if ($objAssetTransaction->Asset instanceof Asset) { // Save the asset just to update the modified_date field so it can trigger an Optimistic Locking Exception when appropriate $objAssetTransaction->Asset->Save(); // Assign the TransactionId $objAssetTransaction->TransactionId = $this->objTransaction->TransactionId; // Create the new asset if it was scheduled for receipt if ($objAssetTransaction->ScheduleReceiptFlag && $objAssetTransaction->NewAsset && $objAssetTransaction->NewAsset instanceof Asset) { $objReceiptAsset = new Asset(); $objReceiptAsset->AssetModelId = $objAssetTransaction->NewAsset->AssetModelId; $objReceiptAsset->LocationId = $objAssetTransaction->NewAsset->LocationId; //if ($objReceiptAsset->AssetCode == '') { if ($objAssetTransaction->NewAsset->AssetCode == '') { $objReceiptAsset->AssetCode = Asset::GenerateAssetCode(); } else { $objReceiptAsset->AssetCode = $objAssetTransaction->NewAsset->AssetCode; } $objReceiptAsset->Save(); // Assign any default custom field values CustomField::AssignNewEntityDefaultValues(1, $objReceiptAsset->AssetId); // Associate the new Asset with the AssetTransaction $objAssetTransaction->NewAsset = $objReceiptAsset; } // $objAssetTransaction->DestinationLocationId = $DestinationLocationId; $objAssetTransaction->Save(); /*$objLinkedAssetArray = Asset::LoadChildLinkedArrayByParentAssetId($objAssetTransaction->Asset->AssetId); if ($objLinkedAssetArray) { foreach ($objLinkedAssetArray as $objLinkedAsset) { $objLinkedAssetTransaction = new AssetTransaction(); $objLinkedAssetTransaction->AssetId = $objLinkedAsset->AssetId; $objLinkedAssetTransaction->SourceLocationId = $objLinkedAsset->LocationId; $objLinkedAssetTransaction->TransactionId = $objAssetTransaction->TransactionId; $objLinkedAssetTransaction->Save(); } }*/ } } } if ($intEntityQtypeId == EntityQtype::AssetInventory || $intEntityQtypeId == EntityQtype::Inventory) { // Assign different source and destinations depending on transaction type foreach ($this->objInventoryTransactionArray as $objInventoryTransaction) { // Save the inventory location just to update the modified_date field so it can triggern an Optimistic Locking Exception when appropriate $objInventoryTransaction->InventoryLocation->Save(); // Assign the TransactionId $objInventoryTransaction->TransactionId = $this->objTransaction->TransactionId; // $objInventoryTransaction->DestinationLocationId = $DestinationLocationId; $objInventoryTransaction->Save(); } } $this->UpdateShipmentFields(); $this->objShipment->ShippedFlag = false; $this->objShipment->Save(); if ($this->arrCustomFields) { // Save the values from all of the custom field controls to save the shipment CustomField::SaveControls($this->objShipment->objCustomFieldArray, $this->blnEditMode, $this->arrCustomFields, $this->objShipment->ShipmentId, 10); } $objDatabase->TransactionCommit(); QApplication::Redirect('shipment_list.php'); } catch (QExtendedOptimisticLockingException $objExc) { // Rollback the database $objDatabase->TransactionRollback(); if ($objExc->Class == 'Asset') { // $this->btnRemoveAssetTransaction_Click($this->FormId, 'btnRemoveAsset' . $objExc->EntityId, $objExc->EntityId); $this->btnRemoveAssetTransaction_Click($this->FormId, null, $objExc->EntityId); $objAsset = Asset::Load($objExc->EntityId); if ($objAsset) { $this->btnCancel->Warning = sprintf('The Asset %s has been modified by another user and removed from this shipment. You may add the asset again or save the transaction without it.', $objAsset->AssetCode); } else { $this->btnCancel->Warning = 'An Asset has been deleted by another user and removed from this shipment.'; } } if ($objExc->Class == 'InventoryLocation') { $this->btnRemoveInventory_Click($this->FormId, 'btnRemoveInventory' . $objExc->EntityId, $objExc->EntityId); $objInventoryLocation = InventoryLocation::Load($objExc->EntityId); if ($objInventoryLocation) { $this->btnCancel->Warning = sprintf('The Inventory %s has been modified by another user and removed from this shipment. You may add the inventory again or save the shipment without it.', $objInventoryLocation->InventoryModel->InventoryModelCode); } else { $this->btnCancel->Warning = 'Inventory has been deleted by another user and removed from this shipment.'; } } } } elseif ($this->blnEditMode) { try { // Get an instance of the database $objDatabase = QApplication::$Database[1]; // Begin a MySQL Transaction to be either committed or rolled back $objDatabase->TransactionBegin(); $this->objTransaction = Transaction::Load($this->objShipment->TransactionId); $this->objTransaction->EntityQtypeId = $intEntityQtypeId; $this->objTransaction->Note = $this->txtNote->Text; $this->objTransaction->Save(); // Remove AssetTransactions that were removed when editing if ($this->arrAssetTransactionToDelete) { foreach ($this->arrAssetTransactionToDelete as $intAssetTransactionId) { $objAssetTransactionToDelete = AssetTransaction::Load($intAssetTransactionId); // Make sure that it wasn't added and then removed if ($objAssetTransactionToDelete) { // Change back location $objAssetTransactionToDelete->Asset->LocationId = $objAssetTransactionToDelete->SourceLocationId; $objAssetTransactionToDelete->Asset->Save(); // Delete the asset that was created for a new receipt if ($objAssetTransactionToDelete->NewAsset && $objAssetTransactionToDelete->NewAsset instanceof Asset && $objAssetTransactionToDelete->ScheduleReceiptFlag) { $objAssetTransactionToDelete->NewAsset->Delete(); } // Delete the asset transaction $objAssetTransactionToDelete->Delete(); unset($objAssetTransactionToDelete); } } } // Save new AssetTransactions if ($this->objAssetTransactionArray) { foreach ($this->objAssetTransactionArray as $objAssetTransaction) { // If the AssetTransaction has not been saved if (!$objAssetTransaction->AssetTransactionId) { $objAssetTransaction->TransactionId = $this->objTransaction->TransactionId; // Save the asset just to update the modified_date field so it can trigger an Optimistic Locking Exception when appropriate $objAssetTransaction->Asset->Save(); // Create the new asset if it was scheduled for receipt // $DestinationLocationId = 2; // Shipped // $objAssetTransaction->DestinationLocationId = $DestinationLocationId; // $objAssetTransaction->Asset->LocationId = $DestinationLocationId; // $objAssetTransaction->Asset->Save(); } if ($objAssetTransaction->ScheduleReceiptFlag && $objAssetTransaction->NewAsset && $objAssetTransaction->NewAsset instanceof Asset && !$objAssetTransaction->NewAssetId) { $objReceiptAsset = new Asset(); $objReceiptAsset->AssetModelId = $objAssetTransaction->NewAsset->AssetModelId; $objReceiptAsset->LocationId = $objAssetTransaction->NewAsset->LocationId; if ($objAssetTransaction->NewAsset->AssetCode == '') { $objReceiptAsset->AssetCode = Asset::GenerateAssetCode(); } else { $objReceiptAsset->AssetCode = $objAssetTransaction->NewAsset->AssetCode; } $objReceiptAsset->Save(); // Assign any default custom field values CustomField::AssignNewEntityDefaultValues(1, $objReceiptAsset->AssetId); // Associate the new Asset with the AssetTransaction $objAssetTransaction->NewAsset = $objReceiptAsset; } $objAssetTransaction->Save(); } } // Remove InventoryTransactions if ($this->arrInventoryTransactionToDelete) { foreach ($this->arrInventoryTransactionToDelete as $intInventoryTransactionId) { $objInventoryTransactionToDelete = InventoryTransaction::Load($intInventoryTransactionId); // Make sure that it wasn't added then removed if ($objInventoryTransactionToDelete) { // Change back the quantity //$objInventoryTransactionToDelete->InventoryLocation->Quantity += $objInventoryTransactionToDelete->Quantity; //$objInventoryTransactionToDelete->InventoryLocation->Save(); // Delete the InventoryTransaction $objInventoryTransactionToDelete->Delete(); unset($objInventoryTransactionToDelete); } } } // Save InventoryTransactions if ($this->objInventoryTransactionArray) { foreach ($this->objInventoryTransactionArray as $objInventoryTransaction) { if (!$objInventoryTransaction->InventoryTransactionId) { // Reload the InventoryLocation. If it was deleted and added in the same save click, then it will throw an Optimistic Locking Exception $objInventoryTransaction->InventoryLocation = InventoryLocation::Load($objInventoryTransaction->InventoryLocationId); $objInventoryTransaction->TransactionId = $this->objTransaction->TransactionId; // Save the inventory location just to update the modified_date field so it can triggern an Optimistic Locking Exception when appropriate $objInventoryTransaction->InventoryLocation->Save(); // $DestinationLocationId = 2; // Shipped // $objInventoryTransaction->DestinationLocationId = $DestinationLocationId; // $objInventoryTransaction->InventoryLocation->Quantity -= $objInventoryTransaction->Quantity; // $objInventoryTransaction->InventoryLocation->Save(); $objInventoryTransaction->Save(); } } } $this->UpdateShipmentFields(); // $this->objShipment->Save(false, true); $this->objShipment->Save(); if ($this->arrCustomFields) { // Save the values from all of the custom field controls to save the shipment CustomField::SaveControls($this->objShipment->objCustomFieldArray, $this->blnEditMode, $this->arrCustomFields, $this->objShipment->ShipmentId, 10); } $objDatabase->TransactionCommit(); //$this->UpdateShipmentLabels(); //$this->SetupShipment(); //$this->DisplayLabels(); //$this->txtTrackingNumber->Enabled = true; QApplication::Redirect('shipment_edit.php?intShipmentId=' . $this->objShipment->ShipmentId); } catch (QExtendedOptimisticLockingException $objExc) { $objDatabase->TransactionRollback(); if ($objExc->Class == 'Shipment') { $this->btnCancel->Warning = sprintf('This shipment has been modified by another user. You must <a href="shipment_edit.php?intShipmentId=%s">Refresh</a> to edit this shipment.', $this->objShipment->ShipmentId); } elseif ($objExc->Class == 'Asset') { //$this->btnRemoveAssetTransaction_Click($this->FormId, 'btnRemoveAsset' . $objExc->EntityId, $objExc->EntityId); $this->btnRemoveAssetTransaction_Click($this->FormId, null, $objExc->EntityId); $objAsset = Asset::Load($objExc->EntityId); if ($objAsset) { $this->btnCancel->Warning = sprintf('The Asset %s has been modified by another user and removed from this shipment. You may add the asset again or save the transaction without it.', $objAsset->AssetCode); } else { $this->btnCancel->Warning = 'An Asset has been deleted by another user and removed from this shipment.'; } } elseif ($objExc->Class == 'InventoryLocation') { $this->btnRemoveInventory_Click($this->FormId, 'btnRemoveInventory' . $objExc->EntityId, $objExc->EntityId); $objInventoryLocation = InventoryLocation::Load($objExc->EntityId); if ($objInventoryLocation) { $this->btnCancel->Warning = sprintf('The Inventory %s has been modified by another user and removed from this shipment. You may add the inventory again or save the shipment without it.', $objInventoryLocation->InventoryModel->InventoryModelCode); } else { $this->btnCancel->Warning = 'Inventory has been deleted by another user and removed from this shipment.'; } } } } } }
/** * Override method to perform a property "Get" * This will get the value of $strName * * @param string $strName Name of the property to get * @return mixed */ public function __get($strName) { switch ($strName) { /////////////////// // Member Variables /////////////////// case 'AssetTransactionId': // Gets the value for intAssetTransactionId (Read-Only PK) // @return integer return $this->intAssetTransactionId; case 'AssetId': // Gets the value for intAssetId (Not Null) // @return integer return $this->intAssetId; case 'TransactionId': // Gets the value for intTransactionId (Not Null) // @return integer return $this->intTransactionId; case 'ParentAssetTransactionId': // Gets the value for intParentAssetTransactionId // @return integer return $this->intParentAssetTransactionId; case 'SourceLocationId': // Gets the value for intSourceLocationId // @return integer return $this->intSourceLocationId; case 'DestinationLocationId': // Gets the value for intDestinationLocationId // @return integer return $this->intDestinationLocationId; case 'NewAssetFlag': // Gets the value for blnNewAssetFlag // @return boolean return $this->blnNewAssetFlag; case 'NewAssetId': // Gets the value for intNewAssetId // @return integer return $this->intNewAssetId; case 'ScheduleReceiptFlag': // Gets the value for blnScheduleReceiptFlag // @return boolean return $this->blnScheduleReceiptFlag; case 'ScheduleReceiptDueDate': // Gets the value for dttScheduleReceiptDueDate // @return QDateTime return $this->dttScheduleReceiptDueDate; case 'CreatedBy': // Gets the value for intCreatedBy // @return integer return $this->intCreatedBy; case 'CreationDate': // Gets the value for dttCreationDate // @return QDateTime return $this->dttCreationDate; case 'ModifiedBy': // Gets the value for intModifiedBy // @return integer return $this->intModifiedBy; case 'ModifiedDate': // Gets the value for strModifiedDate (Read-Only Timestamp) // @return string return $this->strModifiedDate; /////////////////// // Member Objects /////////////////// /////////////////// // Member Objects /////////////////// case 'Asset': // Gets the value for the Asset object referenced by intAssetId (Not Null) // @return Asset try { if (!$this->objAsset && !is_null($this->intAssetId)) { $this->objAsset = Asset::Load($this->intAssetId); } return $this->objAsset; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'Transaction': // Gets the value for the Transaction object referenced by intTransactionId (Not Null) // @return Transaction try { if (!$this->objTransaction && !is_null($this->intTransactionId)) { $this->objTransaction = Transaction::Load($this->intTransactionId); } return $this->objTransaction; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'ParentAssetTransaction': // Gets the value for the AssetTransaction object referenced by intParentAssetTransactionId // @return AssetTransaction try { if (!$this->objParentAssetTransaction && !is_null($this->intParentAssetTransactionId)) { $this->objParentAssetTransaction = AssetTransaction::Load($this->intParentAssetTransactionId); } return $this->objParentAssetTransaction; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'SourceLocation': // Gets the value for the Location object referenced by intSourceLocationId // @return Location try { if (!$this->objSourceLocation && !is_null($this->intSourceLocationId)) { $this->objSourceLocation = Location::Load($this->intSourceLocationId); } return $this->objSourceLocation; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'DestinationLocation': // Gets the value for the Location object referenced by intDestinationLocationId // @return Location try { if (!$this->objDestinationLocation && !is_null($this->intDestinationLocationId)) { $this->objDestinationLocation = Location::Load($this->intDestinationLocationId); } return $this->objDestinationLocation; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'NewAsset': // Gets the value for the Asset object referenced by intNewAssetId // @return Asset try { if (!$this->objNewAsset && !is_null($this->intNewAssetId)) { $this->objNewAsset = Asset::Load($this->intNewAssetId); } return $this->objNewAsset; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'CreatedByObject': // Gets the value for the UserAccount object referenced by intCreatedBy // @return UserAccount try { if (!$this->objCreatedByObject && !is_null($this->intCreatedBy)) { $this->objCreatedByObject = UserAccount::Load($this->intCreatedBy); } return $this->objCreatedByObject; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'ModifiedByObject': // Gets the value for the UserAccount object referenced by intModifiedBy // @return UserAccount try { if (!$this->objModifiedByObject && !is_null($this->intModifiedBy)) { $this->objModifiedByObject = UserAccount::Load($this->intModifiedBy); } return $this->objModifiedByObject; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'AssetTransactionCheckout': // Gets the value for the AssetTransactionCheckout object that uniquely references this AssetTransaction // by objAssetTransactionCheckout (Unique) // @return AssetTransactionCheckout try { if ($this->objAssetTransactionCheckout === false) { // We've attempted early binding -- and the reverse reference object does not exist return null; } if (!$this->objAssetTransactionCheckout) { $this->objAssetTransactionCheckout = AssetTransactionCheckout::LoadByAssetTransactionId($this->intAssetTransactionId); } return $this->objAssetTransactionCheckout; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } //////////////////////////// // Virtual Object References (Many to Many and Reverse References) // (If restored via a "Many-to" expansion) //////////////////////////// //////////////////////////// // Virtual Object References (Many to Many and Reverse References) // (If restored via a "Many-to" expansion) //////////////////////////// case '_ChildAssetTransaction': // Gets the value for the private _objChildAssetTransaction (Read-Only) // if set due to an expansion on the asset_transaction.parent_asset_transaction_id reverse relationship // @return AssetTransaction return $this->_objChildAssetTransaction; case '_ChildAssetTransactionArray': // Gets the value for the private _objChildAssetTransactionArray (Read-Only) // if set due to an ExpandAsArray on the asset_transaction.parent_asset_transaction_id reverse relationship // @return AssetTransaction[] return (array) $this->_objChildAssetTransactionArray; case '__Restored': return $this->__blnRestored; default: try { return parent::__get($strName); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } } }
/** * Static Helper Method to Create using PK arguments * You must pass in the PK arguments on an object to load, or leave it blank to create a new one. * If you want to load via QueryString or PathInfo, use the CreateFromQueryString or CreateFromPathInfo * static helper methods. Finally, specify a CreateType to define whether or not we are only allowed to * edit, or if we are also allowed to create a new one, etc. * * @param mixed $objParentObject QForm or QPanel which will be using this AssetTransactionMetaControl * @param integer $intAssetTransactionId primary key value * @param QMetaControlCreateType $intCreateType rules governing AssetTransaction object creation - defaults to CreateOrEdit * @return AssetTransactionMetaControl */ public static function Create($objParentObject, $intAssetTransactionId = null, $intCreateType = QMetaControlCreateType::CreateOrEdit) { // Attempt to Load from PK Arguments if (strlen($intAssetTransactionId)) { $objAssetTransaction = AssetTransaction::Load($intAssetTransactionId); // AssetTransaction was found -- return it! if ($objAssetTransaction) { return new AssetTransactionMetaControl($objParentObject, $objAssetTransaction); } else { if ($intCreateType != QMetaControlCreateType::CreateOnRecordNotFound) { throw new QCallerException('Could not find a AssetTransaction object with PK arguments: ' . $intAssetTransactionId); } } // If EditOnly is specified, throw an exception } else { if ($intCreateType == QMetaControlCreateType::EditOnly) { throw new QCallerException('No PK arguments specified'); } } // If we are here, then we need to create a new record return new AssetTransactionMetaControl($objParentObject, new AssetTransaction()); }
/** * Override method to perform a property "Get" * This will get the value of $strName * * @param string $strName Name of the property to get * @return mixed */ public function __get($strName) { switch ($strName) { /////////////////// // Member Variables /////////////////// case 'AssetTransactionCheckoutId': // Gets the value for intAssetTransactionCheckoutId (Read-Only PK) // @return integer return $this->intAssetTransactionCheckoutId; case 'AssetTransactionId': // Gets the value for intAssetTransactionId (Unique) // @return integer return $this->intAssetTransactionId; case 'ToContactId': // Gets the value for intToContactId // @return integer return $this->intToContactId; case 'ToUserId': // Gets the value for intToUserId // @return integer return $this->intToUserId; case 'DueDate': // Gets the value for dttDueDate // @return QDateTime return $this->dttDueDate; case 'CreatedBy': // Gets the value for intCreatedBy // @return integer return $this->intCreatedBy; case 'CreationDate': // Gets the value for dttCreationDate // @return QDateTime return $this->dttCreationDate; case 'ModifiedBy': // Gets the value for intModifiedBy // @return integer return $this->intModifiedBy; case 'ModifiedDate': // Gets the value for strModifiedDate (Read-Only Timestamp) // @return string return $this->strModifiedDate; /////////////////// // Member Objects /////////////////// /////////////////// // Member Objects /////////////////// case 'AssetTransaction': // Gets the value for the AssetTransaction object referenced by intAssetTransactionId (Unique) // @return AssetTransaction try { if (!$this->objAssetTransaction && !is_null($this->intAssetTransactionId)) { $this->objAssetTransaction = AssetTransaction::Load($this->intAssetTransactionId); } return $this->objAssetTransaction; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'ToContact': // Gets the value for the Contact object referenced by intToContactId // @return Contact try { if (!$this->objToContact && !is_null($this->intToContactId)) { $this->objToContact = Contact::Load($this->intToContactId); } return $this->objToContact; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'ToUser': // Gets the value for the UserAccount object referenced by intToUserId // @return UserAccount try { if (!$this->objToUser && !is_null($this->intToUserId)) { $this->objToUser = UserAccount::Load($this->intToUserId); } return $this->objToUser; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'CreatedByObject': // Gets the value for the UserAccount object referenced by intCreatedBy // @return UserAccount try { if (!$this->objCreatedByObject && !is_null($this->intCreatedBy)) { $this->objCreatedByObject = UserAccount::Load($this->intCreatedBy); } return $this->objCreatedByObject; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'ModifiedByObject': // Gets the value for the UserAccount object referenced by intModifiedBy // @return UserAccount try { if (!$this->objModifiedByObject && !is_null($this->intModifiedBy)) { $this->objModifiedByObject = UserAccount::Load($this->intModifiedBy); } return $this->objModifiedByObject; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } //////////////////////////// // Virtual Object References (Many to Many and Reverse References) // (If restored via a "Many-to" expansion) //////////////////////////// //////////////////////////// // Virtual Object References (Many to Many and Reverse References) // (If restored via a "Many-to" expansion) //////////////////////////// case '__Restored': return $this->__blnRestored; default: try { return parent::__get($strName); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } } }
public function btnEdit_Click($strFormId, $strControlId, $strParameter) { $strParameterArray = explode(',', $strParameter); $objAssetTransaction = AssetTransaction::Load($strParameterArray[0]); $objEditPanel = new AssetTransactionEditPanel($this, $this->strCloseEditPanelMethod, $objAssetTransaction); $strMethodName = $this->strSetEditPanelMethod; $this->objForm->{$strMethodName}($objEditPanel); }
protected function btnSave_Click($strFormId, $strControlId, $strParameter) { $blnError = false; if ($this->objAssetTransactionArray && $this->objInventoryTransactionArray) { $intEntityQtypeId = EntityQtype::AssetInventory; } elseif ($this->objAssetTransactionArray) { $intEntityQtypeId = EntityQtype::Asset; } elseif ($this->objInventoryTransactionArray) { $intEntityQtypeId = EntityQtype::Inventory; } else { $blnError = true; $this->btnCancel->Warning = 'There are no assets or inventory in this shipment.'; } if (QApplication::$TracmorSettings->CustomShipmentNumbers) { if ($objShipment = Shipment::LoadByShipmentNumber($this->txtShipmentNumber->Text)) { if ($objShipment->ShipmentId != $this->objShipment->ShipmentId) { $blnError = true; $this->txtShipmentNumber->Warning = 'That is a duplicate shipment number.'; } } } if ($this->lstFxServiceType->SelectedValue) { $objtoFxAddress = Address::Load($this->lstToAddress->SelectedValue); if (!$objtoFxAddress || !$objtoFxAddress->PostalCode || !$objtoFxAddress->CountryId || !$objtoFxAddress->Address1) { $blnError = true; $this->lstFxServiceType->Warning = "Not a valid To Address."; } $objfromFxAddress = Address::Load($this->lstFromAddress->SelectedValue); if (!$objfromFxAddress || !$objfromFxAddress->PostalCode || !$objfromFxAddress->Address1 || !$objfromFxAddress->CountryId) { $blnError = true; $this->lstFxServiceType->Warning = "Not a valid From Address."; } $objfromFxContact = Contact::Load($this->lstFromContact->SelectedValue); if (!$objfromFxContact) { $blnError = true; $this->lstFxServiceType->Warning = "Not a valid From Contact."; } $objfromFxCompany = Company::Load($this->lstFromCompany->SelectedValue); if (!$objfromFxCompany) { $blnError = true; $this->lstFxServiceType->Warning = "Not a valid From Company."; } elseif (!$objfromFxCompany->Telephone) { $blnError = true; $this->lstFxServiceType->Warning = "The Shipping Company must have a telephone number."; } $objShippingAccount = ShippingAccount::Load($this->lstShippingAccount->SelectedValue); if (!$objShippingAccount) { $blnError = true; $this->lstFxServiceType->Warning = "Not a valid Shipping Account."; } /* $fed = new FedExDC($objShippingAccount->Value); $aRet = $fed->subscribe( array( 1 => $this->lblShipmentNumber->Text, // Don't really need this but can be used for ref 4003 => $objfromFxContact->__toString(), 4008 => $objfromFxAddress->Address1, 4009 => $objfromFxAddress->Address2, 4011 => $objfromFxAddress->City, 4012 => $objfromFxAddress->__toStringStateProvinceAbbreviation(), 4013 => $objfromFxAddress->PostalCode, 4014 => $objfromFxAddress->__toStringCountryAbbreviation(), 4015 => $this->FxStrip($objfromFxCompany->Telephone), ) ); if ($error = $fed->getError()) { $blnError = true; $this->lstFxServiceType->Warning = $error; } elseif (!$aRet[498]) { $blnError = true; $this->lstFxServiceType->Warning = "Fedex response is improperly formed."; } else { $this->objShipment->FedexMeterNumber = $aRet[498]; }*/ } if (!$blnError) { if (!$this->blnEditMode) { try { // Get an instance of the database $objDatabase = QApplication::$Database[1]; // Begin a MySQL Transaction to be either committed or rolled back $objDatabase->TransactionBegin(); // Create the new transaction object and save it $this->objTransaction = new Transaction(); $this->objTransaction->EntityQtypeId = $intEntityQtypeId; $this->objTransaction->TransactionTypeId = 6; $this->objTransaction->Note = $this->txtNote->Text; $this->objTransaction->Save(); if ($intEntityQtypeId == EntityQtype::AssetInventory || $intEntityQtypeId == EntityQtype::Asset) { // Assign different source and destinations depending on transaction type foreach ($this->objAssetTransactionArray as $objAssetTransaction) { if ($objAssetTransaction->Asset instanceof Asset) { // Save the asset just to update the modified_date field so it can trigger an Optimistic Locking Exception when appropriate $objAssetTransaction->Asset->Save(); // Assign the TransactionId $objAssetTransaction->TransactionId = $this->objTransaction->TransactionId; // Create the new asset if it was scheduled for receipt if ($objAssetTransaction->ScheduleReceiptFlag && $objAssetTransaction->NewAsset && $objAssetTransaction->NewAsset instanceof Asset) { $objReceiptAsset = new Asset(); $objReceiptAsset->AssetModelId = $objAssetTransaction->NewAsset->AssetModelId; $objReceiptAsset->LocationId = $objAssetTransaction->NewAsset->LocationId; //if ($objReceiptAsset->AssetCode == '') { if ($objAssetTransaction->NewAsset->AssetCode == '') { $objReceiptAsset->AssetCode = Asset::GenerateAssetCode(); } else { $objReceiptAsset->AssetCode = $objAssetTransaction->NewAsset->AssetCode; } $objReceiptAsset->Save(); // Assign any default custom field values CustomField::AssignNewEntityDefaultValues(1, $objReceiptAsset->AssetId); // Associate the new Asset with the AssetTransaction $objAssetTransaction->NewAsset = $objReceiptAsset; } // $objAssetTransaction->DestinationLocationId = $DestinationLocationId; $objAssetTransaction->Save(); /*$objLinkedAssetArray = Asset::LoadChildLinkedArrayByParentAssetId($objAssetTransaction->Asset->AssetId); if ($objLinkedAssetArray) { foreach ($objLinkedAssetArray as $objLinkedAsset) { $objLinkedAssetTransaction = new AssetTransaction(); $objLinkedAssetTransaction->AssetId = $objLinkedAsset->AssetId; $objLinkedAssetTransaction->SourceLocationId = $objLinkedAsset->LocationId; $objLinkedAssetTransaction->TransactionId = $objAssetTransaction->TransactionId; $objLinkedAssetTransaction->Save(); } }*/ } } } if ($intEntityQtypeId == EntityQtype::AssetInventory || $intEntityQtypeId == EntityQtype::Inventory) { // Assign different source and destinations depending on transaction type foreach ($this->objInventoryTransactionArray as $objInventoryTransaction) { // Save the inventory location just to update the modified_date field so it can triggern an Optimistic Locking Exception when appropriate $objInventoryTransaction->InventoryLocation->Save(); // Assign the TransactionId $objInventoryTransaction->TransactionId = $this->objTransaction->TransactionId; // $objInventoryTransaction->DestinationLocationId = $DestinationLocationId; $objInventoryTransaction->Save(); } } $this->UpdateShipmentFields(); $this->objShipment->ShippedFlag = false; $this->objShipment->Save(); if ($this->arrCustomFields) { // Save the values from all of the custom field controls to save the shipment CustomField::SaveControls($this->objShipment->objCustomFieldArray, $this->blnEditMode, $this->arrCustomFields, $this->objShipment->ShipmentId, 10); } // If the courier is FedEx, create new fedexShipment if ($this->lstCourier->SelectedValue === 1) { $this->objFedexShipment = new FedexShipment(); $this->objFedexShipment->Shipment = $this->objShipment; $this->UpdateFedexFields(); $this->objFedexShipment->Save(); } $objDatabase->TransactionCommit(); QApplication::Redirect('shipment_list.php'); } catch (QExtendedOptimisticLockingException $objExc) { // Rollback the database $objDatabase->TransactionRollback(); if ($objExc->Class == 'Asset') { // $this->btnRemoveAssetTransaction_Click($this->FormId, 'btnRemoveAsset' . $objExc->EntityId, $objExc->EntityId); $this->btnRemoveAssetTransaction_Click($this->FormId, null, $objExc->EntityId); $objAsset = Asset::Load($objExc->EntityId); if ($objAsset) { $this->btnCancel->Warning = sprintf('The Asset %s has been modified by another user and removed from this shipment. You may add the asset again or save the transaction without it.', $objAsset->AssetCode); } else { $this->btnCancel->Warning = 'An Asset has been deleted by another user and removed from this shipment.'; } } if ($objExc->Class == 'InventoryLocation') { $this->btnRemoveInventory_Click($this->FormId, 'btnRemoveInventory' . $objExc->EntityId, $objExc->EntityId); $objInventoryLocation = InventoryLocation::Load($objExc->EntityId); if ($objInventoryLocation) { $this->btnCancel->Warning = sprintf('The Inventory %s has been modified by another user and removed from this shipment. You may add the inventory again or save the shipment without it.', $objInventoryLocation->InventoryModel->InventoryModelCode); } else { $this->btnCancel->Warning = 'Inventory has been deleted by another user and removed from this shipment.'; } } } } elseif ($this->blnEditMode) { try { // Get an instance of the database $objDatabase = QApplication::$Database[1]; // Begin a MySQL Transaction to be either committed or rolled back $objDatabase->TransactionBegin(); $this->objTransaction = Transaction::Load($this->objShipment->TransactionId); $this->objTransaction->EntityQtypeId = $intEntityQtypeId; $this->objTransaction->Note = $this->txtNote->Text; $this->objTransaction->Save(); // Remove AssetTransactions that were removed when editing if ($this->arrAssetTransactionToDelete) { foreach ($this->arrAssetTransactionToDelete as $intAssetTransactionId) { $objAssetTransactionToDelete = AssetTransaction::Load($intAssetTransactionId); // Make sure that it wasn't added and then removed if ($objAssetTransactionToDelete) { // Change back location $objAssetTransactionToDelete->Asset->LocationId = $objAssetTransactionToDelete->SourceLocationId; $objAssetTransactionToDelete->Asset->Save(); // Delete the asset that was created for a new receipt if ($objAssetTransactionToDelete->NewAsset && $objAssetTransactionToDelete->NewAsset instanceof Asset && $objAssetTransactionToDelete->ScheduleReceiptFlag) { $objAssetTransactionToDelete->NewAsset->Delete(); } // Delete the asset transaction $objAssetTransactionToDelete->Delete(); unset($objAssetTransactionToDelete); } } } // Save new AssetTransactions if ($this->objAssetTransactionArray) { foreach ($this->objAssetTransactionArray as $objAssetTransaction) { // If the AssetTransaction has not been saved if (!$objAssetTransaction->AssetTransactionId) { $objAssetTransaction->TransactionId = $this->objTransaction->TransactionId; // Save the asset just to update the modified_date field so it can trigger an Optimistic Locking Exception when appropriate $objAssetTransaction->Asset->Save(); // Create the new asset if it was scheduled for receipt // $DestinationLocationId = 2; // Shipped // $objAssetTransaction->DestinationLocationId = $DestinationLocationId; // $objAssetTransaction->Asset->LocationId = $DestinationLocationId; // $objAssetTransaction->Asset->Save(); } if ($objAssetTransaction->ScheduleReceiptFlag && $objAssetTransaction->NewAsset && $objAssetTransaction->NewAsset instanceof Asset && !$objAssetTransaction->NewAssetId) { $objReceiptAsset = new Asset(); $objReceiptAsset->AssetModelId = $objAssetTransaction->NewAsset->AssetModelId; $objReceiptAsset->LocationId = $objAssetTransaction->NewAsset->LocationId; if ($objAssetTransaction->NewAsset->AssetCode == '') { $objReceiptAsset->AssetCode = Asset::GenerateAssetCode(); } else { $objReceiptAsset->AssetCode = $objAssetTransaction->NewAsset->AssetCode; } $objReceiptAsset->Save(); // Assign any default custom field values CustomField::AssignNewEntityDefaultValues(1, $objReceiptAsset->AssetId); // Associate the new Asset with the AssetTransaction $objAssetTransaction->NewAsset = $objReceiptAsset; } $objAssetTransaction->Save(); } } // Remove InventoryTransactions if ($this->arrInventoryTransactionToDelete) { foreach ($this->arrInventoryTransactionToDelete as $intInventoryTransactionId) { $objInventoryTransactionToDelete = InventoryTransaction::Load($intInventoryTransactionId); // Make sure that it wasn't added then removed if ($objInventoryTransactionToDelete) { // Change back the quantity $objInventoryTransactionToDelete->InventoryLocation->Quantity += $objInventoryTransactionToDelete->Quantity; $objInventoryTransactionToDelete->InventoryLocation->Save(); // Delete the InventoryTransaction $objInventoryTransactionToDelete->Delete(); unset($objInventoryTransactionToDelete); } } } // Save InventoryTransactions if ($this->objInventoryTransactionArray) { foreach ($this->objInventoryTransactionArray as $objInventoryTransaction) { if (!$objInventoryTransaction->InventoryTransactionId) { // Reload the InventoryLocation. If it was deleted and added in the same save click, then it will throw an Optimistic Locking Exception $objInventoryTransaction->InventoryLocation = InventoryLocation::Load($objInventoryTransaction->InventoryLocationId); $objInventoryTransaction->TransactionId = $this->objTransaction->TransactionId; // Save the inventory location just to update the modified_date field so it can triggern an Optimistic Locking Exception when appropriate $objInventoryTransaction->InventoryLocation->Save(); // $DestinationLocationId = 2; // Shipped // $objInventoryTransaction->DestinationLocationId = $DestinationLocationId; // $objInventoryTransaction->InventoryLocation->Quantity -= $objInventoryTransaction->Quantity; // $objInventoryTransaction->InventoryLocation->Save(); $objInventoryTransaction->Save(); } } } $this->UpdateShipmentFields(); // $this->objShipment->Save(false, true); $this->objShipment->Save(); if ($this->arrCustomFields) { // Save the values from all of the custom field controls to save the shipment CustomField::SaveControls($this->objShipment->objCustomFieldArray, $this->blnEditMode, $this->arrCustomFields, $this->objShipment->ShipmentId, 10); } // If the courier is FedEx, save the fedexShipment if ($this->lstCourier->SelectedValue === 1) { if ($this->objFedexShipment) { // FedexShipment already exists, so update it $this->UpdateFedexFields(); $this->objFedexShipment->Save(); } else { // FedexShipment doesn't exist yet, so create it $this->objFedexShipment = new FedexShipment(); $this->objFedexShipment->Shipment = $this->objShipment; $this->UpdateFedexFields(); $this->objFedexShipment->Save(); } } else { if ($this->objFedexShipment) { // FedexShipment exists - delete it because the selected courier is no longer FedEx $this->objFedexShipment->Delete(); $this->objFedexShipment = null; } } $objDatabase->TransactionCommit(); $this->UpdateShipmentLabels(); $this->SetupShipment(); $this->DisplayLabels(); if ($this->objShipment->CourierId == 1) { $this->txtTrackingNumber->Enabled = false; $this->lstPackageType->Enabled = true; } else { $this->txtTrackingNumber->Enabled = true; $this->lstPackageType->Enabled = false; } // Reload lstPackageType $this->lstPackageType->RemoveAllItems(); $this->LoadPackageTypes(); } catch (QExtendedOptimisticLockingException $objExc) { $objDatabase->TransactionRollback(); if ($objExc->Class == 'Shipment') { $this->btnCancel->Warning = sprintf('This shipment has been modified by another user. You must <a href="shipment_edit.php?intShipmentId=%s">Refresh</a> to edit this shipment.', $this->objShipment->ShipmentId); } elseif ($objExc->Class == 'Asset') { //$this->btnRemoveAssetTransaction_Click($this->FormId, 'btnRemoveAsset' . $objExc->EntityId, $objExc->EntityId); $this->btnRemoveAssetTransaction_Click($this->FormId, null, $objExc->EntityId); $objAsset = Asset::Load($objExc->EntityId); if ($objAsset) { $this->btnCancel->Warning = sprintf('The Asset %s has been modified by another user and removed from this shipment. You may add the asset again or save the transaction without it.', $objAsset->AssetCode); } else { $this->btnCancel->Warning = 'An Asset has been deleted by another user and removed from this shipment.'; } } elseif ($objExc->Class == 'InventoryLocation') { $this->btnRemoveInventory_Click($this->FormId, 'btnRemoveInventory' . $objExc->EntityId, $objExc->EntityId); $objInventoryLocation = InventoryLocation::Load($objExc->EntityId); if ($objInventoryLocation) { $this->btnCancel->Warning = sprintf('The Inventory %s has been modified by another user and removed from this shipment. You may add the inventory again or save the shipment without it.', $objInventoryLocation->InventoryModel->InventoryModelCode); } else { $this->btnCancel->Warning = 'Inventory has been deleted by another user and removed from this shipment.'; } } } } } }
/** * Override method to perform a property "Get" * This will get the value of $strName * * @param string $strName Name of the property to get * @return mixed */ public function __get($strName) { switch ($strName) { /////////////////// // Member Variables /////////////////// case 'AssetTransactionId': /** * Gets the value for intAssetTransactionId (Read-Only PK) * @return integer */ return $this->intAssetTransactionId; case 'AssetId': /** * Gets the value for intAssetId (Not Null) * @return integer */ return $this->intAssetId; case 'TransactionId': /** * Gets the value for intTransactionId (Not Null) * @return integer */ return $this->intTransactionId; case 'ParentAssetTransactionId': /** * Gets the value for intParentAssetTransactionId * @return integer */ return $this->intParentAssetTransactionId; case 'SourceLocationId': /** * Gets the value for intSourceLocationId * @return integer */ return $this->intSourceLocationId; case 'DestinationLocationId': /** * Gets the value for intDestinationLocationId * @return integer */ return $this->intDestinationLocationId; case 'NewAssetFlag': /** * Gets the value for blnNewAssetFlag * @return boolean */ return $this->blnNewAssetFlag; case 'NewAssetId': /** * Gets the value for intNewAssetId * @return integer */ return $this->intNewAssetId; case 'ScheduleReceiptFlag': /** * Gets the value for blnScheduleReceiptFlag * @return boolean */ return $this->blnScheduleReceiptFlag; case 'ScheduleReceiptDueDate': /** * Gets the value for dttScheduleReceiptDueDate * @return QDateTime */ return $this->dttScheduleReceiptDueDate; case 'CreatedBy': /** * Gets the value for intCreatedBy * @return integer */ return $this->intCreatedBy; case 'CreationDate': /** * Gets the value for dttCreationDate * @return QDateTime */ return $this->dttCreationDate; case 'ModifiedBy': /** * Gets the value for intModifiedBy * @return integer */ return $this->intModifiedBy; case 'ModifiedDate': /** * Gets the value for strModifiedDate (Read-Only Timestamp) * @return string */ return $this->strModifiedDate; /////////////////// // Member Objects /////////////////// /////////////////// // Member Objects /////////////////// case 'Asset': /** * Gets the value for the Asset object referenced by intAssetId (Not Null) * @return Asset */ try { if (!$this->objAsset && !is_null($this->intAssetId)) { $this->objAsset = Asset::Load($this->intAssetId); } return $this->objAsset; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'Transaction': /** * Gets the value for the Transaction object referenced by intTransactionId (Not Null) * @return Transaction */ try { if (!$this->objTransaction && !is_null($this->intTransactionId)) { $this->objTransaction = Transaction::Load($this->intTransactionId); } return $this->objTransaction; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'ParentAssetTransaction': /** * Gets the value for the AssetTransaction object referenced by intParentAssetTransactionId * @return AssetTransaction */ try { if (!$this->objParentAssetTransaction && !is_null($this->intParentAssetTransactionId)) { $this->objParentAssetTransaction = AssetTransaction::Load($this->intParentAssetTransactionId); } return $this->objParentAssetTransaction; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'SourceLocation': /** * Gets the value for the Location object referenced by intSourceLocationId * @return Location */ try { if (!$this->objSourceLocation && !is_null($this->intSourceLocationId)) { $this->objSourceLocation = Location::Load($this->intSourceLocationId); } return $this->objSourceLocation; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'DestinationLocation': /** * Gets the value for the Location object referenced by intDestinationLocationId * @return Location */ try { if (!$this->objDestinationLocation && !is_null($this->intDestinationLocationId)) { $this->objDestinationLocation = Location::Load($this->intDestinationLocationId); } return $this->objDestinationLocation; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'NewAsset': /** * Gets the value for the Asset object referenced by intNewAssetId * @return Asset */ try { if (!$this->objNewAsset && !is_null($this->intNewAssetId)) { $this->objNewAsset = Asset::Load($this->intNewAssetId); } return $this->objNewAsset; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'CreatedByObject': /** * Gets the value for the UserAccount object referenced by intCreatedBy * @return UserAccount */ try { if (!$this->objCreatedByObject && !is_null($this->intCreatedBy)) { $this->objCreatedByObject = UserAccount::Load($this->intCreatedBy); } return $this->objCreatedByObject; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } case 'ModifiedByObject': /** * Gets the value for the UserAccount object referenced by intModifiedBy * @return UserAccount */ try { if (!$this->objModifiedByObject && !is_null($this->intModifiedBy)) { $this->objModifiedByObject = UserAccount::Load($this->intModifiedBy); } return $this->objModifiedByObject; } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } //////////////////////////// // Virtual Object References (Many to Many and Reverse References) // (If restored via a "Many-to" expansion) //////////////////////////// //////////////////////////// // Virtual Object References (Many to Many and Reverse References) // (If restored via a "Many-to" expansion) //////////////////////////// case '_ChildAssetTransaction': /** * Gets the value for the private _objChildAssetTransaction (Read-Only) * if set due to an expansion on the asset_transaction.parent_asset_transaction_id reverse relationship * @return AssetTransaction */ return $this->_objChildAssetTransaction; case '_ChildAssetTransactionArray': /** * Gets the value for the private _objChildAssetTransactionArray (Read-Only) * if set due to an ExpandAsArray on the asset_transaction.parent_asset_transaction_id reverse relationship * @return AssetTransaction[] */ return (array) $this->_objChildAssetTransactionArray; default: try { return parent::__get($strName); } catch (QCallerException $objExc) { $objExc->IncrementOffset(); throw $objExc; } } }
$arrPendingReceiptId[] = $objPendingReceipt->Transaction->Receipt->ReceiptId; $objAssetTransactionArray[$objNewAsset->AssetId] = $objPendingReceipt; } } } if (!$blnError) { $arrPendingReceiptId = array_unique($arrPendingReceiptId); foreach ($objAssetArray as $objAsset) { $objDestinationLocation = $arrLocation[$objAsset->AssetId]; $intDestinationLocationId = $objDestinationLocation->LocationId; // Set the DestinationLocation of the AssetTransaction $objAssetTransaction = $objAssetTransactionArray[$objAsset->AssetId]; $objAssetTransaction->DestinationLocationId = $intDestinationLocationId; $objAssetTransaction->Save(); // Reload AssetTransaction to avoid Optimistic Locking Exception if this receipt is edited and saved. $objAssetTransaction = AssetTransaction::Load($objAssetTransaction->AssetTransactionId); // Move the asset to the new location $objAssetTransaction->Asset->LocationId = $intDestinationLocationId; $objAssetTransaction->Asset->Save(); $objAssetTransaction->Asset = Asset::Load($objAssetTransaction->AssetId); } foreach ($arrPendingReceiptId as $intReceiptId) { Receipt::ReceiptComplete($intReceiptId); } $strWarning .= "Your transaction has successfully completed<br /><a href='index.php'>Main Menu</a> | <a href='asset_menu.php'>Manage Assets</a><br />"; //Remove that flag when transaction is compelete or exists some errors unset($_SESSION['intUserAccountId']); $blnTransactionComplete = true; $arrCheckedAssetCodeLocation = ""; } else { $strWarning .= "This transaction has not been completed.<br />";