text: /************************************************************
   *
   *  CmdProposePlan.cpp
   *
   */
  
  /************************************************************
   -----BEGIN PGP SIGNED MESSAGE-----
   Hash: SHA1
  
   *                 OPEN TRANSACTIONS
   *
   *       Financial Cryptography and Digital Cash
   *       Library, Protocol, API, Server, CLI, GUI
   *
   *       -- Anonymous Numbered Accounts.
   *       -- Untraceable Digital Cash.
   *       -- Triple-Signed Receipts.
   *       -- Cheques, Vouchers, Transfers, Inboxes.
   *       -- Basket Currencies, Markets, Payment Plans.
   *       -- Signed, XML, Ricardian-style Contracts.
   *       -- Scripted smart contracts.
   *
   *  Copyright (C) 2010-2013 by "Fellow Traveler" (A pseudonym)
   *
   *  EMAIL:
   *  FellowTraveler@rayservers.net
   *
   *  BITCOIN:  1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ
   *
   *  KEY FINGERPRINT (PGP Key in license file):
   *  9DD5 90EB 9292 4B48 0484  7910 0308 00ED F951 BB8E
   *
   *  OFFICIAL PROJECT WIKI(s):
   *  https://github.com/FellowTraveler/Moneychanger
   *  https://github.com/FellowTraveler/Open-Transactions/wiki
   *
   *  WEBSITE:
   *  http://www.OpenTransactions.org/
   *
   *  Components and licensing:
   *   -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3
   *   -- otlib.........A class library.......LICENSE:...LAGPLv3
   *   -- otapi.........A client API..........LICENSE:...LAGPLv3
   *   -- opentxs/ot....Command-line client...LICENSE:...LAGPLv3
   *   -- otserver......Server Application....LICENSE:....AGPLv3
   *  Github.com/FellowTraveler/Open-Transactions/wiki/Components
   *
   *  All of the above OT components were designed and written by
   *  Fellow Traveler, with the exception of Moneychanger, which
   *  was contracted out to Vicky C (bitcointrader4@gmail.com).
   *  The open-source community has since actively contributed.
   *
   *  -----------------------------------------------------
   *
   *   LICENSE:
   *   This program is free software: you can redistribute it
   *   and/or modify it under the terms of the GNU Affero
   *   General Public License as published by the Free Software
   *   Foundation, either version 3 of the License, or (at your
   *   option) any later version.
   *
   *   ADDITIONAL PERMISSION under the GNU Affero GPL version 3
   *   section 7: (This paragraph applies only to the LAGPLv3
   *   components listed above.) If you modify this Program, or
   *   any covered work, by linking or combining it with other
   *   code, such other code is not for that reason alone subject
   *   to any of the requirements of the GNU Affero GPL version 3.
   *   (==> This means if you are only using the OT API, then you
   *   don't have to open-source your code--only your changes to
   *   Open-Transactions itself must be open source. Similar to
   *   LGPLv3, except it applies to software-as-a-service, not
   *   just to distributing binaries.)
   *
   *   Extra WAIVER for OpenSSL, Lucre, and all other libraries
   *   used by Open Transactions: This program is released under
   *   the AGPL with the additional exemption that compiling,
   *   linking, and/or using OpenSSL is allowed. The same is true
   *   for any other open source libraries included in this
   *   project: complete waiver from the AGPL is hereby granted to
   *   compile, link, and/or use them with Open-Transactions,
   *   according to their own terms, as long as the rest of the
   *   Open-Transactions terms remain respected, with regard to
   *   the Open-Transactions code itself.
   *
   *   Lucre License:
   *   This code is also "dual-license", meaning that Ben Lau-
   *   rie's license must also be included and respected, since
   *   the code for Lucre is also included with Open Transactions.
   *   See Open-Transactions/src/otlib/lucre/LUCRE_LICENSE.txt
   *   The Laurie requirements are light, but if there is any
   *   problem with his license, simply remove the Lucre code.
   *   Although there are no other blind token algorithms in Open
   *   Transactions (yet. credlib is coming), the other functions
   *   will continue to operate.
   *   See Lucre on Github:  https://github.com/benlaurie/lucre
   *   -----------------------------------------------------
   *   You should have received a copy of the GNU Affero General
   *   Public License along with this program.  If not, see:
   *   http://www.gnu.org/licenses/
   *
   *   If you would like to use this software outside of the free
   *   software license, please contact FellowTraveler.
   *   (Unfortunately many will run anonymously and untraceably,
   *   so who could really stop them?)
   *
   *   DISCLAIMER:
   *   This program is distributed in the hope that it will be
   *   useful, but WITHOUT ANY WARRANTY; without even the implied
   *   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
   *   PURPOSE.  See the GNU Affero General Public License for
   *   more details.
  
   -----BEGIN PGP SIGNATURE-----
   Version: GnuPG v1.4.9 (Darwin)
  
   iQIcBAEBAgAGBQJRSsfJAAoJEAMIAO35UbuOQT8P/RJbka8etf7wbxdHQNAY+2cC
   vDf8J3X8VI+pwMqv6wgTVy17venMZJa4I4ikXD/MRyWV1XbTG0mBXk/7AZk7Rexk
   KTvL/U1kWiez6+8XXLye+k2JNM6v7eej8xMrqEcO0ZArh/DsLoIn1y8p8qjBI7+m
   aE7lhstDiD0z8mwRRLKFLN2IH5rAFaZZUvj5ERJaoYUKdn4c+RcQVei2YOl4T0FU
   LWND3YLoH8naqJXkaOKEN4UfJINCwxhe5Ke9wyfLWLUO7NamRkWD2T7CJ0xocnD1
   sjAzlVGNgaFDRflfIF4QhBx1Ddl6wwhJfw+d08bjqblSq8aXDkmFA7HeunSFKkdn
   oIEOEgyj+veuOMRJC5pnBJ9vV+7qRdDKQWaCKotynt4sWJDGQ9kWGWm74SsNaduN
   TPMyr9kNmGsfR69Q2Zq/FLcLX/j8ESxU+HYUB4vaARw2xEOu2xwDDv6jt0j3Vqsg
   x7rWv4S/Eh18FDNDkVRChiNoOIilLYLL6c38uMf1pnItBuxP3uhgY6COm59kVaRh
   nyGTYCDYD2TK+fI9o89F1297uDCwEJ62U0Q7iTDp5QuXCoxkPfv8/kX6lS6T3y9G
   M9mqIoLbIQ1EDntFv7/t6fUTS2+46uCrdZWbQ5RjYXdrzjij02nDmJAm2BngnZvd
   kamH0Y/n11lCvo1oQxM+
   =uSzz
   -----END PGP SIGNATURE-----
   **************************************************************/
  
  #include "CmdProposePlan.hpp"
  
  #include <opentxs/client/OTAPI.hpp>
  #include <opentxs/client/OT_ME.hpp>
  #include <opentxs/core/Log.hpp>
  
  using namespace opentxs;
  using namespace std;
  
  CmdProposePlan::CmdProposePlan()
  {
      command = "proposeplan";
      args[0] = "--server <server>";
      args[1] = "--mynym <nym>";
      args[2] = "--hisnym <nym>";
      args[3] = "--myacct <account>";
      args[4] = "--hisacct <account>";
      args[5] = "[--memo <consideration>]";
      args[6] = "[--daterange <start,length>]";
      args[7] = "[--initialpayment <amount,delay>";
      args[8] = "[--paymentplan <amount,delay,period>";
      args[9] = "[--planexpiry <length,number>";
      category = catInstruments;
      help = "as merchant, propose a payment plan to a customer.";
      usage = "Daterange: <start> default is the current time,\n"
              "           <length> default is 'no expiry.'\n"
              "Initialpayment <amount> default is 0 (no initial payment),\n"
              "               <delay> in seconds, from creation date.\n"
              "Paymentplan <amount> is a recurring payment,\n"
              "            <delay> in seconds, default is 30 days,\n"
              "            <period> in seconds, default is 30 days.\n"
              "Planexpiry <length> in seconds, default is unlimited,\n"
              "           <number> of payments, default is unlimited.";
  }
  
  CmdProposePlan::~CmdProposePlan()
  {
  }
  
  int32_t CmdProposePlan::runWithOptions()
  {
      return run(getOption("server"), getOption("mynym"), getOption("hisnym"),
                 getOption("myacct"), getOption("hisacct"), getOption("memo"),
                 getOption("daterange"), getOption("initialpayment"),
                 getOption("paymentplan"), getOption("planexpiry"));
  }
  
  // The merchant (sender of proposal / payee of proposal) proposes the payment
  // plan to the customer (recipient of proposal / payer of proposal.)
  // So this function is called by the merchant.
  
  int32_t CmdProposePlan::run(string server, string mynym, string hisnym,
                              string myacct, string hisacct, string memo,
                              string daterange, string initialpayment,
                              string paymentplan, string planexpiry)
  {
      if (!checkServer("server", server)) {
          return -1;
      }
  
      if (!checkNym("mynym", mynym)) {
          return -1;
      }
  
      if (!checkNym("hisnym", mynym)) {
          return -1;
      }
  
      if (!checkAccount("myacct", myacct)) {
          return -1;
      }
  
      if (!checkAccount("hisacct", myacct)) {
          return -1;
      }
  
      if ("" == memo) {
          memo = inputText("a consideration");
          if ("" == memo) {
              return -1;
          }
      }
  
      otOut << "date_range (from,to): " << daterange << "\n";
      otOut << "consideration: " << memo << "\n";
      otOut << "initial_payment (amount,delay): " << initialpayment << "\n";
      otOut << "payment_plan (amount,delay,period): " << paymentplan << "\n";
      otOut << "plan_expiry (length,number): " << planexpiry << "\n";
  
      OT_ME ot_me;
      if (!ot_me.make_sure_enough_trans_nums(2, server, mynym)) {
          otOut << "Error: cannot reserve transaction numbers.\n";
          return -1;
      }
  
      // OTAPI_Wrap::EasyProposePlan is a version of ProposePaymentPlan that
      // compresses it into a fewer number of arguments. (Then it expands them
      // and calls ProposePaymentPlan.)
      // Basically this version has ALL the same parameters, but it stuffs two or
      // three at a time into a single parameter, as a comma-separated list in
      // string form. See details for each parameter, in the comment below.
      string plan = OTAPI_Wrap::EasyProposePlan(
          server, daterange, hisacct, hisnym, memo, myacct, mynym, initialpayment,
          paymentplan, planexpiry);
      if ("" == plan) {
          otOut << "Error: cannot create proposed plan.\n";
          return -1;
      }
  
      // The "propose" step (performed by the merchant) includes the merchant's
      // confirmation / signing.
      // (So there's no need for the merchant to additionally "confirm" the plan
      // before sending it -- he already has done that by this point, just as part
      // of the proposal itself.)
  
      string response = ot_me.send_user_payment(server, mynym, hisnym, plan);
      if (1 != responseStatus(response)) {
          otOut << "Error: cannot send payment plan.\n";
          return harvestTxNumbers(plan, mynym);
      }
  
      return 1;
  }
  