updating Stripe Price object - stripe-payments

I had a question that seems to be easy but apparently is not working. I need to update the price for a Price object, but the following does not work. It gives the error that unit_amount is not known, although we use it to define the Price object initially:
stripe.Price.modify(
"price_1Hkb5FHdAaIdH7ntvOhZOyFK",
unit_amount=10,
)

You can not modify the price of a Price in the API. This is not something that is supported as there's no corresponding parameter on the API.
If you want to change the amount associated with a Price, you would create a new Price object and start using it instead. You could also make the old one inactive for example.
Another powerful feature of Stripe's API is the lookup_key on Price (doc). This lets you define a custom alias for your Price in your code. That way instead of hardcoding the price id price_123 in your code and having to update it to use price_abcd, you can transfer the old lookup key from the old price to the new one and have your code seamlessly start using the new one automatically. The idea is that you either cache the Price id associated with a lookup key based on webhooks for example or use the List Prices API and the lookup_keys parameter to quickly find the latest price id associated with a given lookup key!

Related

Changing product price in Shopware 6 dynamically

I would like to change the price of a product based on the customer's selection. For example, I'm trying to build a small PDP widget to make customers able to choose the number of candles on a cake or write text on cakes and update the price accordingly. The docs only cover how to change the price by overwriting the cart's collector/processor but I don't want to use this method because of other plugins potentially overwriting the same service. So, is there are any other methods of changing the price of the products by subscribing to an event?
There are a few things you will need to consider in this one.
Firstly, you will need to save the user input data somewhere (amount of candles, text).
Possibly a separate database table that has a OneToMany relationship on cart line items. See this article. Und ya, this is also the part where you will hook into the onLineItemAdd event & save your user input to that table. You may as well also subscribe to the onLineItemUpdate for the same saving logic. You could do the same when removing the item from the cart, although that may not be necessary if you use database's "CASCADE on delete" when implementing your DB table. Meaning once the line item gets removed by the customer (deleted in the DB), your database entry gets deleted as well.
Afterwards, you can then use the extensions or otherwise called associations to pull this data on the cart page & the order pages. You can be a little more fancy here, if you look at all the frontend router calls, you will notice that Shopware sometimes passes "Criteria" class you can hook into.
public static function getSubscribedEvents(): array
{
return [
OrderRouteRequestEvent::class => 'alterCriteria',
DocumentOrderCriteriaEvent::class => 'alterCriteria',
];
}
public function alterCriteria(Event $event): void
{
if (method_exists($event, 'getCriteria')) {
$event->getCriteria()->addAssociation('lineItems.myExtension'); // check syntax, could be lineItem.
}
}
Now you can extend the twig templates to show your candles or text in the order page, cart page, document (invoice) pages.
Secondly, you will have to handle the price. This part will be easier now that you have data saved & being automatically pulled via criteria subscribers. If it's not possible to hook into those events all the time, you will still have an option to manually load your data.
I do not recommend modifying the price itself, but maybe you could look into adding a surcharge instead. Maybe this article will be helpful to understand the price flow. You could also see if there are any other plugins out there that implement surcharge logic to see it in action.

How to get 'Bills and Adjustment' grid fields in an endpoint extension

I'm working with a client on obtaining Bills and Adjustments values through the Contract based web services. I understand that certain fields aren't available in the Default Endpoint, and have to be obtained through an extension.
I'm trying to add fields from the Bills and Adjustments' Applications tab, but I'm running into a warning that I don't understand. If I extend the Default endpoint for 'Bills' (call it 'BillExt'), and I try to add the Reference Number field from the 'Applications' tab/grid (or any other field from that grid) - I get the following warning (see screenshot below)...
Can someone explain what the issue is, and how I go about adding these fields from the 'Applictaions' tab/grid? I've added fields from the 'Approval Details' grid without this warning without a problem. Is this a warning I can disregard?
You are trying to add a field from another table/view that can return multiple rows for a single Bill.
The correct way to do this is by adding a separate collection on the object and map the view on that collection. e.g: Applications or Details collections here.
That collection will have the information for all records related to the header once you retrieve them using the ?$expand=Details on the query string request.

Evaluate discount promotion in Product Detail Page

Scenario :
I've been trying to implement something like Amazon has on their product pages in, where the non promoted price is crossed, and the promoted price is highlighted.
I have the PROMOTIONS product option selected in the controller, and
it is returning the potencialPromotion, but it doesn't have the value
of the discount in that structure only the message (as on the
Accelerator it appears the message).
I'm in Hybris 6.6 and I looked up the DefaultPromotionEngineService.evaluate method because it is used in the Cart, and for the cart it returns the promotion actions, but the equivalent method for the product isn't returning anything.
Has anybody done this? Seems like a pretty convencional request although I know it goes against the flexibility of promotion engine.
I can use a Regex against the message to get the discount, but it's a road I don't want to take because it will end badly....
Please suggest.
Thank you
Since you haven't mentioned it before, I have answered based on Legacy Promotion, not the Promotion Engine. I'll update answer if there is a way to do the same in Promotion Engine.
It's true, OOTB there is no service which gives you the discount price on PDP.
I think what you can do,
Override PromotionsPopulator to get the discount value and set it to promotionData.
if (fixedPricePromotion instanceof ProductFixedPricePromotionModel)
{
PromotionPriceRowModel promotionPriceRowModel = ((ProductFixedPricePromotionModel)source).getProductFixedUnitPrice();
//TODO: covert promotionPriceRowModel to promotionPriceData
//TODO: set to promotionData
}
ProductPromotionsPopulator internally calls the above populator to convert ProductPromotionModel to data.
I think we can achieve this using the price row. We can create one more price row and display the logic correctly based on the discount price.

Amazon MWS Api usage

I am using "http://www.amazon.de/dp/{ASIN}" to get product info.
But after getting response it doesn't return product "SellerSKU"
Is there any way that I can get "SellerSKU" of a product specified by "ASIN"?
I also had same situation.
And I found that there is only some limited way to get it.
https://mws.amazonservices.com/FulfillmentInventory/2010-10-01?Action=ListInventorySupply
ListInventorySupply api of Fulfillment Inventory lists returns information about the availability of a seller's inventory.
Request parameter includes SellerSKUs, QueryStartDateTime, MarketplaceId, ResponseGroup
Here you can omit SellerSKUs, and you can pass QueryStartDateTime.
Then you will get InventorySupplyList including SellerSKU and ASIN matches.
You should find the product's SellerSKU in this list.
But the problem is that it returns only available inventory list.
It will not work when product you are finding is not in available inventory list.
In this case you should make the user manually add SellerSKU in your application.
For more information, please take a look at http://docs.developer.amazonservices.com/en_US/fba_inventory/FBAInventory_ListInventorySupply.html
Hope this would help you.

Fetch transactions from Stripe::Transfer with latest stripe version

I am using stripe latest version in production.
When I try to fetch transactions:
Stripe::Transfer.all.first.transactions
I fount, there is no transactions method for latest Stripe::Transfer
undefined method `transactions' for #<Stripe::Transfer
Stripe API is upgrades:
2014-08-04
The transactions, summary, and other_transfers properties in automatic transfer responses have been removed in favor of the balance history endpoint (/v1/balance/history), which can be called with the transfer id (using the ?transfer= parameter) to filter transactions by transfer.
So How we fetch transactions from Stripe transfer ?
But its working fine with Stripe old version.
You have a couple of options depending on what you want. If you a certain level of detail for charges you can fetch all the charges associated with a transfer which will fetch only that:
var options = {};
stripe.transfers.listTransactions(id, options);
If, on the other hand, you would like something more akin to the old summary object then I would get the balances associated with the transfer:
var options = { transfer: id };
stripe.balance.listTransactions(options);
The balances returned will contain a variety of balance types - the first one refers to the actual transfer as a whole and can be ignored and the rest is a combo of charges, refunds, adjustments, etc including the fees for each.
In both the above cases id refers to the transfer ID. Note that you will need to loop through these to fetch all items - this can be done in a couple of ways as listed under Pagination. In the above cases, I check if the result contains the has_more: true field and, if so, loop through again using the starting_after: X addecd to the options object where X is the ID of the last charge/balance returned on previous call.

Resources