The Amazon SP-API getorderItems doesn't return itemprice - amazon

Amazon SP-API getOrderItems returns null of itemprice when the order is AFN. But the itemPrice is actual price when the order is MFN. Does anybody know how to get the actual sell price of a FBA orderItem?
AFN without itemprice
MFN with itemprice

The pricing information will now be available in the getOrderItems API when the order is in the Pending state.

Related

How to charge existing customers for a products?

If you know Audible, that's how my service works. You can have subscriptions which you get credits for but you can also just buy single items right away (if you want).
Subscriptions work for me but what I can't get my head around is how I can charge an existing customer, using his default payment method, on a single item. Let's stick to Audible.
A user wants to buy a single audio-track.
I though I can:
Create a Product for this track (setting a name and an image-url)
Create or re-use a Price and set the charge-amount as stated in my database
Somehow create an Invoice or Charge for this Price/Product and move one
However, I just don't quite get how to do that.
Looking at the docs of Invoice, it appears to me that I am not able to add a single product or price and let Stripe automatically charge the customer.
I thought it would look something like this:
public void buyProduct(String productId, Customer customer) {
InvoiceCreateParams.builder()
.setCustomer(customer.getId())
.setDefaultPaymentMethod(customer.getPaymentMethod())
.setAutoAdvance(true)
.setCollectionMethod(CollectionMethod.CHARGE_AUTOMATICALLY)
// Add product/price here ?
.build();
// ...
}
So, what is the simplest way to charge a customer for a product?
Update
I noticed that an InvoiceItem can take a Invoice ID.
Is the following correct (in principal)?
Setting autoAdvance to true and CHARGE_AUTOMATICALLY as collection-method, will the user charged correctly as I intend to using the code below?
public void createInvoice() throws StripeException {
String customerId = null;
String paymentMethodId = null;
String priceId = null;
boolean chargeAutomatically = true;
InvoiceCreateParams invoiceCreateParams = InvoiceCreateParams.builder()
.setCustomer(customerId)
.setDefaultPaymentMethod(paymentMethodId)
.setAutoAdvance(chargeAutomatically)
.setCollectionMethod(CollectionMethod.CHARGE_AUTOMATICALLY)
.build();
Invoice invoice = Invoice.create(invoiceCreateParams);
InvoiceItemCreateParams invoiceItemCreateParams = InvoiceItemCreateParams.builder()
.setCustomer(customerId)
.setPrice(priceId)
.setInvoice(invoice.getId())
.build();
InvoiceItem invoiceItem = InvoiceItem.create(invoiceItemCreateParams);
}
It feels weird to create an invoice at first, and set everything up for charging a customer immediatelly, and only after having done so, set the actual item that the user wants to buy.
You should take a look at this: https://stripe.com/docs/billing/invoices/sending#one-off
First, you'll want to create an Invoice Item using the Price and Customer ID (no need to create the invoice first). You can create as many Invoice Items as you want, depending on how many things you want to charge your customer for. Then you can create an Invoice which will automatically pick up all the pending Invoice Items for a given Customer.

How to handle Stripe subscriptions based on Currency?

I'm using the Stripe payment gateway for my SAAS app.
I have created a Product and multiple Plans are linked to it. Plans price is in USD.
I have created a new customer. Then I'm trying to subscribe to a Plan, but I'm getting the below error
You cannot combine currencies on a single customer. This customer has had a subscription, coupon, or invoice item with currency inr
I have seen their documentation, it is not allowing me to change the Currency of the customer.
Is there anyway I can convert USD to the currency of the customer before subscribing?
My recommendation would be to, prior to attaching the subscription, retrieve the customer object for which you'd like to have a subscription attached, determine the currency of the customer, and create a new plan (in the currency) if necessary. To do this though, you'd probably want to use a currency conversion API from a third-party, as Stripe does not support that.
Example in Python:
plan_id = ... # This would have been retrieved from your form, most likely (eg. 'basic-plan')
usd_plan = stripe.Plan.retrieve(plan_id)
cus = stripe.Customer.retrieve()
if cus.currency is not 'usd': # if the currency of the customer is not "usd"
# create a new plan id for currency (eg. 'basic-plan-cad')
plan_id = plan_id + '-' + cus.currency # check if there is a
# use a 3rd party to get the currency
amount_in_currency = amount * <API_CONVERSION_RATE>
# check that the plan doesn't already exist and create it otherwise
try:
stripe.Plan.create(
amount=amount_in_currency,
interval=usd_plan.interval,
product={
"name": usd_plan.product
},
currency=cus.currency,
id=plan_id
)
except Exception as e: # this may fail if the plan already exists
break
# create the subscription
sub = stripe.Subscription.create(
customer="cus_xxx",
items=[
{
"plan": plan_id, # this will either be the `basic-plan` or `basic-plan-{currency}
},
]
)

How to insert Adjustment record with Contract API

I'm trying to insert an adjustment record via the SOAP API using the following code.
Dim NewAdjustment As Adjustment = New Adjustment With {
.ExternalRef = New StringValue With {.Value = "TEST1234"},
.Description = New StringValue With {.Value = "1234TEST"},
.[Date] = New DateTimeValue With {.Value = "12/20/2018"},
.Details = {New AdjustmentDetail With {
.BranchID = New StringValue With {.Value = "PRODWHOLE"},
.InventoryID = New StringValue With {.Value = "18r.5"},
.WarehouseID = New StringValue With {.Value = "RETAIL"},
.Qty = New DecimalValue With {.Value = 100}
}}
}
Dim InsertAdjustment As Adjustment = CType(soapClient.Put(NewAdjustment), Adjustment)
I get an error px.data.pcexception: Error: 'Branch' cannot be empty. Error: 'Post Period' cannot be empty. Error Inserting 'Receipt' record raised at least one error.
I'm guessing I need to fill those values but I'm not sure how to do that. I see them in the table but not the API interface. I'm new to Acumatica, so I'm guessing this is just something I'm missing.
Thanks in advance.
I have never seen the usage of the Date property as [Date], but that does not mean it will not work. The Posting period is defaulted based on the value of the date property. Make sure that the December 2018 posting period is open on the company that you are logged into with the API. I have seen this error from time to time when the accounting department does not open the period in a timely fashion.
The BranchID is defaulted based on the login parameters of the soapClient. One thing to be aware of is that your API login user needs to have permissions to the BranchID being used, or you will definitely get an error about the Branch being invalid.
Depending on the Inventory costing methodology used by your company, Inventory Adjustments might require that they be processed against an inventory Receipt. This can be tricky to figure out what to do, especially if you have never received anything for this Item in a new implementation, and you want to increase inventory levels. For positive Adjustments in your business case, you might want to consider creating Inventory Receipts instead of Adjustments. The entity is very similar to the Adjustments. For negative Adjustments you might want to consider using Inventory Issues which is again, quite similar.
If you decide to use adjustments, you will have to search the Inventory Receipts for an appopriate Receipt number to use when populating the transaction details. One for each line you insert.

Acumatica Web API Apply Discounts

I am trying to get a way to obtain the discount code from the web service API, i.e would there be a function call that could tell me which discount code to apply?
I am otherwise attempting to retrieve the discount codes but they can be by Item or By Item Price Class and Customer etc etc which is making the code longer than expected.
Hopeing there is a "GetBestDiscount" facility in the API that could help me?
Thanks,
G
At this moment Acumatica Discount Engine is deactivated for any Web Service call. Due to this fact, entering an order line without any discount will not populate the discount code.
However, at Acumatica University there is the GetSalesPrice.zip customization package made specifically to retrieving the price of an Item for a Customer (attached to the I200 Screen-Based Web Services 5.3 and the I210 Contract-Based Web Services 5.3 sources).
Sample call for Screen-Based API:
Content getSalesPriceSchema = context.GetSchema();
var commands = new Command[]
{
new Value
{
Value = customer,
LinkedCommand =getSalesPriceSchema.RequiredInputParameters.Customer
},
new Value
{
Value = inventoryID,
LinkedCommand =getSalesPriceSchema.RequiredInputParameters.InventoryID
},
getSalesPriceSchema.OutputPrice.Price
};
Content price = context.Submit(commands)[0];
Sample call for Contract-Based API:
GetSalesPriceInquiry priceToBeGet = new GetSalesPriceInquiry
{
Customer = new StringValue { Value = customer },
InventoryID = new StringValue { Value = inventoryID }
};
GetSalesPriceInquiry stockItemPrice = (GetSalesPriceInquiry)soapClient.Put(priceToBeGet);
I tried creating a temporary Sales order line via API Order Entry Screen without saving it as Gabriel suggestion.
I can retrieve the set price no problems but the Discount Percentage and Discount Code is not returned.
The discount percentage returned is zero and the discount Code is blank.
This is because the Acumatica Discount Engine is deactivated for any Web Service call I guess.
Any reason why the Acumatica Discount Engine is deactivated for any Web Service calls?
There is no such API, however you could use the sales order entry screen API to create a temporary sales order, add one line to it and retrieve the set price or discount without saving the order. This will be the most accurate information, since discounts and price can also depend on the date, quantity and also on other products being ordered at the same time.

Foursquare venue search (intent "browse") does not seem to honor categoryId

if I make this query:
https://api.foursquare.com/v2/venues/search?categoryId=4e4c9077bd41f78e849722f9%2C4f4531084b9074f6e4fb0101%2C4bf58dd8d48988d1f7941735%2C4bf58dd8d48988d1fa941735%2C5032872391d4c4b30a586d64%2C4bf58dd8d48988d115951735%2C4bf58dd8d48988d1d3941735%2C4bf58dd8d48988d1ef941735%2C4bf58dd8d48988d116951735&client_id=DBYECJMGA0AB1XQP1GW5CV5WNXD4331IODMHARY5D3GSEOIB&intent=browse&limit=50&ne=43.802819%2C11.162109&sw=43.786958%2C11.140137&v=20131109&locale=en&client_secret=CLIENT_SECRET
in which I specify multiple category IDs, I get back this result:
{"meta":{"code":200},"response":{"venues":[{"id":"4f3ccf34e4b030292acf2336","name":"DI TUTTO DI PIU' - Mercatino usato","contact":{},"location":{"address":"Via Manderi, 62, 50013 Campi Bisenzio FI","lat":43.79576849102895,"lng":11.15417380610575,"postalCode":"50013","cc":"IT","city":"Campi Bisenzio","state":"Tuscany","country":"Italy"},"categories":[{"id":"4bf58dd8d48988d127951735","name":"Arts & Crafts Store","pluralName":"Arts & Crafts Stores","shortName":"Arts & Crafts","icon":{"prefix":"https://ss1.4sqi.net/img/categories_v2/shops/artstore_","suffix":".png"},"primary":true}],"verified":false,"restricted":true,"stats":{"checkinsCount":16,"usersCount":15,"tipCount":2},"specials":{"count":0,"items":[]},"hereNow":{"count":0,"groups":[]},"referralId":"v-1392811869"}]}}
which contains a venue whose categoryId is 4bf58dd8d48988d127951735 ("Arts & Crafts Store"), which is not included in the request.
The compact venue result that you posted is only showing the primary category of the venue, which is an arts and crafts store. However, if you run a venue details call with that venue ID, you're able to see that the venue has a secondary category ID of flea market, which you searched for. The search matches on both primary and secondary category IDs

Resources