NetSuite Invoice Creation MLI_LOCATION_REQUIRED bu

2019-08-04 15:57发布

问题:

Seems like most people are using the PHP Toolkit for NetSuite webservices interaction; I am not, but I'll paste the SOAP encoded request/response in the hopes someone can help (coughSuite Resourcescough).

I'm trying to create a new invoice with a single invoice item. I get the error:

Multi-location Inventory Error (MLI_LOCATION_REQUIRED): this transaction or its items must have locations.

However when I try to set the location on the invoice itself I get the error:

You do not have permissions to set a value for element location due to one of the following reasons: 1) The field is read-only; 2) An associated feature is disabled; 3) The field is available either when a record is created or updated, but not in both cases.

[1] pry(main)> invoice.add

D, [2014-12-19T16:47:19.997923 #13995] DEBUG -- : HTTPI GET request to webservices.sandbox.netsuite.com (net_http)
I, [2014-12-19T16:47:20.464235 #13995]  INFO -- : SOAP request: https://webservices.sandbox.netsuite.com/services/NetSuitePort_2013_2
I, [2014-12-19T16:47:20.464378 #13995]  INFO -- : SOAPAction: "add", Content-Type: text/xml;charset=UTF-8, Content-Length: 2568
D, [2014-12-19T16:47:20.464926 #13995] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:platformMsgs="urn:messages_2013_2.platform.webservices.netsuite.com" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:platformCore="urn:core_2013_2.platform.webservices.netsuite.com" xmlns:platformCommon="urn:common_2013_2.platform.webservices.netsuite.com" xmlns:listRel="urn:relationships_2013_2.lists.webservices.netsuite.com" xmlns:tranSales="urn:sales_2013_2.transactions.webservices.netsuite.com" xmlns:actSched="urn:scheduling_2013_2.activities.webservices.netsuite.com" xmlns:setupCustom="urn:customization_2013_2.setup.webservices.netsuite.com" xmlns:listAcct="urn:accounting_2013_2.lists.webservices.netsuite.com" xmlns:tranBank="urn:bank_2013_2.transactions.webservices.netsuite.com" xmlns:tranCust="urn:customers_2013_2.transactions.webservices.netsuite.com" xmlns:tranInvt="urn:inventory_2013_2.transactions.webservices.netsuite.com" xmlns:listSupport="urn:support_2013_2.lists.webservices.netsuite.com" xmlns:tranGeneral="urn:general_2013_2.transactions.webservices.netsuite.com" xmlns:listMkt="urn:marketing_2013_2.lists.webservices.netsuite.com" xmlns:listWebsite="urn:website_2013_2.lists.webservices.netsuite.com" xmlns:fileCabinet="urn:filecabinet_2013_2.documents.webservices.netsuite.com" xmlns:listEmp="urn:employees_2013_2.lists.webservices.netsuite.com">
  <env:Header>
    <platformMsgs:passport>
      <platformCore:email>[REDACTED]</platformCore:email>
      <platformCore:password>[REDACTED]</platformCore:password>
      <platformCore:account>[REDACTED]</platformCore:account>
      <platformCore:role internalId="3"/>
    </platformMsgs:passport>
  </env:Header>
  <env:Body>
    <platformMsgs:add>
      <platformMsgs:record xsi:type="tranSales:Invoice">
        <tranSales:email>[REDACTED]</tranSales:email>
        <tranSales:isTaxable>false</tranSales:isTaxable>
        <tranSales:entity internalId="26017" externalId="[REDACTED]" type="customer"/>
        <tranSales:itemList>
          <tranSales:item>
            <tranSales:item internalId="152"/>
            <tranSales:line>1</tranSales:line>
            <tranSales:orderLine>1</tranSales:orderLine>
            <tranSales:amount>313</tranSales:amount>
            <tranSales:location internalId="1" type="location"/>
            <tranSales:revRecStartDate>2014-12-01T08:13:00.000Z</tranSales:revRecStartDate>
            <tranSales:revRecEndDate>2015-12-01T08:13:00.000Z</tranSales:revRecEndDate>
          </tranSales:item>
        </tranSales:itemList>
      </platformMsgs:record>
    </platformMsgs:add>
  </env:Body>
</env:Envelope>

D, [2014-12-19T16:47:20.465337 #13995] DEBUG -- : HTTPI POST request to webservices.sandbox.netsuite.com (net_http)
I, [2014-12-19T16:47:23.786293 #13995]  INFO -- : SOAP response (status 200)
D, [2014-12-19T16:47:23.786660 #13995] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Header>
    <platformMsgs:documentInfo xmlns:platformMsgs="urn:messages_2013_2.platform.webservices.netsuite.com">
      <platformMsgs:nsId>WEBSERVICES_[REDACTED]_121920141668433096579618905_1be2c0a823e5</platformMsgs:nsId>
    </platformMsgs:documentInfo>
  </soapenv:Header>
  <soapenv:Body>
    <addResponse xmlns="urn:messages_2013_2.platform.webservices.netsuite.com">
      <writeResponse>
        <platformCore:status xmlns:platformCore="urn:core_2013_2.platform.webservices.netsuite.com" isSuccess="false">
          <platformCore:statusDetail type="ERROR">
            <platformCore:code>MLI_REQD</platformCore:code>
            <platformCore:message>Multi-location Inventory Error (MLI_LOCATION_REQUIRED): this transaction or its items must have locations.</platformCore:message>
          </platformCore:statusDetail>
          <platformCore:statusDetail type="WARN">
            <platformCore:code>WARNING</platformCore:code>
            <platformCore:message>Fake Billing Line Item: You have only 0 available across all locations (0 back ordered, 0 on order).</platformCore:message>
          </platformCore:statusDetail>
        </platformCore:status>
      </writeResponse>
    </addResponse>
  </soapenv:Body>
</soapenv:Envelope>

=> false
[2] pry(main)> invoice.location = ottawa
=> #<NetSuite::Records::Location:0x007fca96a5eea8
 @attributes=
  {:name=>"Ottawa",
   :is_inactive=>false,
   :addressee=>"Ottawa",
   :addr1=>"[REDACTED]",
   :city=>"Ottawa",
   :state=>"ON",
   :zip=>"[REDACTED]",
   :country=>"_canada",
   :addr_text=>"Ottawa\n[REDACTED]\nOttawa ON [REDACTED]",
   :override=>false,
   :make_inventory_available=>false},
 @external_id=nil,
 @internal_id="1">
[3] pry(main)> invoice.add
D, [2014-12-19T16:48:03.626321 #13995] DEBUG -- : HTTPI GET request to webservices.sandbox.netsuite.com (net_http)
I, [2014-12-19T16:48:04.090118 #13995]  INFO -- : SOAP request: https://webservices.sandbox.netsuite.com/services/NetSuitePort_2013_2
I, [2014-12-19T16:48:04.090331 #13995]  INFO -- : SOAPAction: "add", Content-Type: text/xml;charset=UTF-8, Content-Length: 2640
D, [2014-12-19T16:48:04.090841 #13995] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:platformMsgs="urn:messages_2013_2.platform.webservices.netsuite.com" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:platformCore="urn:core_2013_2.platform.webservices.netsuite.com" xmlns:platformCommon="urn:common_2013_2.platform.webservices.netsuite.com" xmlns:listRel="urn:relationships_2013_2.lists.webservices.netsuite.com" xmlns:tranSales="urn:sales_2013_2.transactions.webservices.netsuite.com" xmlns:actSched="urn:scheduling_2013_2.activities.webservices.netsuite.com" xmlns:setupCustom="urn:customization_2013_2.setup.webservices.netsuite.com" xmlns:listAcct="urn:accounting_2013_2.lists.webservices.netsuite.com" xmlns:tranBank="urn:bank_2013_2.transactions.webservices.netsuite.com" xmlns:tranCust="urn:customers_2013_2.transactions.webservices.netsuite.com" xmlns:tranInvt="urn:inventory_2013_2.transactions.webservices.netsuite.com" xmlns:listSupport="urn:support_2013_2.lists.webservices.netsuite.com" xmlns:tranGeneral="urn:general_2013_2.transactions.webservices.netsuite.com" xmlns:listMkt="urn:marketing_2013_2.lists.webservices.netsuite.com" xmlns:listWebsite="urn:website_2013_2.lists.webservices.netsuite.com" xmlns:fileCabinet="urn:filecabinet_2013_2.documents.webservices.netsuite.com" xmlns:listEmp="urn:employees_2013_2.lists.webservices.netsuite.com">
  <env:Header>
    <platformMsgs:passport>
      <platformCore:email>[REDACTED]</platformCore:email>
      <platformCore:password>[REDACTED]</platformCore:password>
      <platformCore:account>[REDACTED]</platformCore:account>
      <platformCore:role internalId="3"/>
    </platformMsgs:passport>
  </env:Header>
  <env:Body>
    <platformMsgs:add>
      <platformMsgs:record xsi:type="tranSales:Invoice">
        <tranSales:email>[REDACTED]</tranSales:email>
        <tranSales:isTaxable>false</tranSales:isTaxable>
        <tranSales:entity internalId="26017" externalId="[REDACTED]" type="customer"/>
        <tranSales:itemList>
          <tranSales:item>
            <tranSales:item internalId="152"/>
            <tranSales:line>1</tranSales:line>
            <tranSales:orderLine>1</tranSales:orderLine>
            <tranSales:amount>313</tranSales:amount>
            <tranSales:location internalId="1" type="location"/>
            <tranSales:revRecStartDate>2014-12-01T08:13:00.000Z</tranSales:revRecStartDate>
            <tranSales:revRecEndDate>2015-12-01T08:13:00.000Z</tranSales:revRecEndDate>
          </tranSales:item>
        </tranSales:itemList>
        <tranSales:location internalId="1" type="location"/>
      </platformMsgs:record>
    </platformMsgs:add>
  </env:Body>
</env:Envelope>

D, [2014-12-19T16:48:04.091365 #13995] DEBUG -- : HTTPI POST request to webservices.sandbox.netsuite.com (net_http)
I, [2014-12-19T16:48:05.738270 #13995]  INFO -- : SOAP response (status 200)
D, [2014-12-19T16:48:05.738785 #13995] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Header>
    <platformMsgs:documentInfo xmlns:platformMsgs="urn:messages_2013_2.platform.webservices.netsuite.com">
      <platformMsgs:nsId>WEBSERVICES_[REDACTED]_121920141668476805866012724_a7c7c427c826</platformMsgs:nsId>
    </platformMsgs:documentInfo>
  </soapenv:Header>
  <soapenv:Body>
    <addResponse xmlns="urn:messages_2013_2.platform.webservices.netsuite.com">
      <writeResponse>
        <platformCore:status xmlns:platformCore="urn:core_2013_2.platform.webservices.netsuite.com" isSuccess="false">
          <platformCore:statusDetail type="ERROR">
            <platformCore:code>INSUFFICIENT_PERMISSION</platformCore:code>
            <platformCore:message>You do not have permissions to set a value for element location due to one of the following reasons: 1) The field is read-only; 2) An associated feature is disabled; 3) The field is available either when a record is created or updated, but not in both cases.</platformCore:message>
          </platformCore:statusDetail>
        </platformCore:status>
      </writeResponse>
    </addResponse>
  </soapenv:Body>
</soapenv:Envelope>

=> false
[4] pry(main)>

回答1:

Looking at the "invoice.location" JSON Data ([2] pry(main)> invoice.location = ottawa) posted in your question, i see you have "make_inventory_available" field set as false on the Location Record inside of NetSuite.

Could you try the below and let me know if it works:

  1. In NetSuite User Interface, Navigate to Setup -> Company -> Locations (under Classifications).
  2. Edit the Location with Internal Id "1" i.e. "Ottawa".
  3. Set the Checkbox Field "MAKE INVENTORY AVAILABLE" to true.
  4. Now try performing the invoice.add operation by setting the location field on Item Level as posted in your first soap xml request ([1] pry(main)> invoice.add).