int CInstrumentManager::GetFreeSequenceIndex(inst_type_t InstType, int Type, CSeqInstrument *pInst) const { // moved from CFamiTrackerDoc std::vector<bool> Used(CSequenceCollection::MAX_SEQUENCES, false); for (int i = 0; i < MAX_INSTRUMENTS; i++) if (GetInstrumentType(i) == InstType) { // // // auto pInstrument = std::static_pointer_cast<CSeqInstrument>(GetInstrument(i)); if (pInstrument->GetSeqEnable(Type) && (pInst && pInst->GetSequence(Type)->GetItemCount() || pInst != pInstrument.get())) Used[pInstrument->GetSeqIndex(Type)] = true; } for (int i = 0; i < CSequenceCollection::MAX_SEQUENCES; ++i) if (!Used[i]) { const CSequence *pSeq = GetSequence(InstType, Type, i); if (!pSeq || !pSeq->GetItemCount()) return i; } return -1; }
// --------------------------------------- bool MTRecord::FormatDescription(std::string & str_output) { OTString strDescription, strStatus, strKind; if (IsRecord()) { if (IsExpired()) strStatus = "(EXPIRED)"; // How to tell difference between instrument that processed successfully and THEN expired, versus one that expired before processing successfully? (See next comment.) else if (IsInvoice()) strStatus = "(payment sent)"; // TODO: need an "invalid records" box for expired and canceled. Otherwise we may falsely assume "payment sent" when actually it expired. (We may also falsely assume payment expired when actually it was sent.) Solution is a new box. else strStatus = ""; // strStatus = "(record)"; } // ----------------------------- else if (IsPending()) { if (IsExpired()) strStatus = "(EXPIRED)"; else if (IsInvoice()) strStatus = "(unpaid)"; else if (!IsCash()) strStatus = "(pending)"; } // ----------------------------- if (IsCanceled()) { strStatus = "(CANCELED)"; if (IsOutgoing() || IsReceipt()) strKind.Format("%s", "sent "); } // ----------------------------- else { if (IsOutgoing()) strKind.Format("%s", ((IsPending() && !IsCash()) ? "outgoing " : "sent ")); else // incoming. strKind.Format("%s", IsPending() ? "incoming " : (IsReceipt() ? "" : "received ")); } // ----------------------------- OTString strTransNumForDisplay; if (!IsCash()) strTransNumForDisplay.Format(" #%ld", GetTransNumForDisplay()); // ----------------------------- if (IsRecord()) { if (this->IsTransfer()) strDescription.Format("%s%s%s %s", strKind.Get(), "transfer", strTransNumForDisplay.Get(), strStatus.Get()); else if (this->IsVoucher()) strDescription.Format("%s%s%s %s", strKind.Get(), "payment", strTransNumForDisplay.Get(), strStatus.Get()); else if (this->IsReceipt()) { std::string str_instrument_type; if (0 == GetInstrumentType().compare("transferReceipt")) str_instrument_type = "transfer"; else if (0 == GetInstrumentType().compare("finalReceipt")) str_instrument_type = "final receipt (closed)"; else if (0 == GetInstrumentType().compare("chequeReceipt")) { const long lAmount = OTAPI_Wrap::It()->StringToLong(m_str_amount); // I paid OUT when this chequeReceipt came through. It must be a normal cheque that I wrote. if (lAmount <= 0) // Notice less than OR EQUAL TO 0 -- that's because a canceled cheque has a 0 value. str_instrument_type = "cheque"; else // I GOT PAID when this chequeReceipt came through. It must be an invoice I wrote, that someone paid. { if (IsCanceled()) str_instrument_type = "invoice"; else str_instrument_type = "invoice (payment received)"; } } else if (0 == GetInstrumentType().compare("voucherReceipt")) { str_instrument_type = "payment"; } else if (0 == GetInstrumentType().compare("paymentReceipt")) { const long lAmount = OTAPI_Wrap::It()->StringToLong(m_str_amount); if (!IsCanceled() && (lAmount > 0)) strKind.Set("received "); str_instrument_type = "recurring payment"; } strDescription.Format("%s%s%s %s", strKind.Get(), str_instrument_type.c_str(), strTransNumForDisplay.Get(), strStatus.Get()); } else strDescription.Format("%s%s%s %s", strKind.Get(), GetInstrumentType().c_str(), strTransNumForDisplay.Get(), strStatus.Get()); } else { if (this->IsTransfer()) strDescription.Format("%s %s%s%s", strStatus.Get(), strKind.Get(), "transfer", strTransNumForDisplay.Get()); else if (this->IsVoucher()) strDescription.Format("%s %s%s%s", strStatus.Get(), strKind.Get(), "payment", strTransNumForDisplay.Get()); else if (this->IsReceipt()) { std::string str_instrument_type; if (0 == GetInstrumentType().compare("transferReceipt")) { if (IsCanceled()) str_instrument_type = "transfer"; else str_instrument_type = "transfer (receipt)"; } else if (0 == GetInstrumentType().compare("finalReceipt")) str_instrument_type = "final receipt"; else if (0 == GetInstrumentType().compare("chequeReceipt")) { const long lAmount = OTAPI_Wrap::It()->StringToLong(m_str_amount); // I paid OUT when this chequeReceipt came through. It must be a normal cheque that I wrote. if (lAmount <= 0) // Notice less than OR EQUAL TO 0 -- that's because a canceled cheque has a 0 value. { if (IsCanceled()) str_instrument_type = "cheque"; else str_instrument_type = "cheque (receipt)"; } else // I GOT PAID when this chequeReceipt came through. It must be an invoice I wrote, that someone paid. { if (IsCanceled()) str_instrument_type = "invoice"; else str_instrument_type = "sent invoice (receipt: payment received)"; } } else if (0 == GetInstrumentType().compare("voucherReceipt")) { if (IsCanceled()) str_instrument_type = "payment"; else str_instrument_type = "payment (receipt)"; } else if (0 == GetInstrumentType().compare("paymentReceipt")) { const long lAmount = OTAPI_Wrap::It()->StringToLong(m_str_amount); if (!IsCanceled() && (lAmount > 0)) strKind.Set("received "); str_instrument_type = "recurring payment (receipt)"; } strDescription.Format("%s %s%s%s", strStatus.Get(), strKind.Get(), str_instrument_type.c_str(), strTransNumForDisplay.Get()); } else strDescription.Format("%s %s%s%s", strStatus.Get(), strKind.Get(), GetInstrumentType().c_str(), strTransNumForDisplay.Get()); } // ----------------------------- str_output = strDescription.Get(); // ----------------------------- return (!str_output.empty()); }