Store actual delivery cost

main
Ashelyn Dawn 4 years ago
parent 4c4efac975
commit 5788d8d4ef

@ -165,7 +165,7 @@ router.post('/current/checkout/verify', ensureCart, parseJSON, async (req, res)
})
router.post('/:uuid/ship/tracking', ensureAdmin, parseJSON, async (req, res) => {
const order = await db.order.setTracking(req.params.uuid, req.body.code, req.body.date || null)
const order = await db.order.setTracking(req.params.uuid, req.body.code, req.body.date || null, req.body.price_cents)
res.json(order)
})

@ -99,6 +99,7 @@ function ShippingStatus({totalShipping, delivery, isAdmin}) {
{isAdmin && (
<p>
{formatMoney(totalShipping)} charged to customer<br/>
{(delivery.price_cents && !delivery.easypost) && (<>{formatMoney(parseInt(delivery.price_cents, 10))} paid to ship<br/></>)}
{delivery.easypost && (<>{formatMoney(parseFloat(delivery.easypost.selected_rate.rate) * 100)} paid to EasyPost</>)}
</p>
)}

@ -83,6 +83,7 @@ module.exports = [{
properties: [
'type',
'tracking_number',
'price_cents',
'date_shipped',
'easypost_id',
'description',

@ -261,10 +261,10 @@ order.addPayment = async function(transaction, paymentIntent){
return order
}
order.setTracking = (uuid, trackingCode, shipDate) =>
order.setTracking = (uuid, trackingCode, shipDate, price_cents) =>
dbUtil.executeFunction({
name: 'set_delivery_tracking',
params: [uuid, trackingCode, shipDate],
params: [uuid, trackingCode, shipDate, price_cents],
returnType: 'order',
single: true
})
@ -298,13 +298,15 @@ order.shipEasyPost = async ( uuid, length, width, height, weight ) => {
await epShipment.save()
// Purchase shipment (lowest USPS rate)
const {tracking_code, id: easypost_id}
const {tracking_code, id: easypost_id, selected_rate: {rate: price_string}}
= await epShipment.buy(epShipment.lowestRate(['USPS']))
const price_cents = Math.floor(parseFloat(price_string) * 100)
// Save tracking code and easypost id
return await dbUtil.executeFunction({
name: 'set_delivery_easypost',
params: [uuid, easypost_id, tracking_code],
params: [uuid, easypost_id, tracking_code, price_cents],
returnType: 'order',
single: true
})

@ -115,6 +115,7 @@ create table sos."delivery_hand_shipped" (
delivery_type sos.delivery_type_enum check (delivery_type = 'hand_shipped'),
foreign key (delivery_uuid, delivery_type) references sos."delivery" (delivery_uuid, delivery_type),
delivery_price_cents integer not null,
delivery_tracking_number text not null,
delivery_date_shipped timestamptz not null default now()
);
@ -124,6 +125,7 @@ create table sos."delivery_easypost" (
delivery_type sos.delivery_type_enum check (delivery_type = 'easypost'),
foreign key (delivery_uuid, delivery_type) references sos."delivery" (delivery_uuid, delivery_type),
delivery_price_cents integer not null,
delivery_tracking_number text not null,
delivery_date_shipped timestamptz not null,
delivery_easypost_id text not null

@ -100,6 +100,7 @@ create or replace view sos.v_delivery as
"delivery".*,
coalesce("delivery_hand_shipped".delivery_tracking_number, "delivery_easypost".delivery_tracking_number) as delivery_tracking_number,
coalesce("delivery_hand_shipped".delivery_date_shipped, "delivery_easypost".delivery_date_shipped) as delivery_date_shipped,
coalesce("delivery_hand_shipped".delivery_price_cents, "delivery_easypost".delivery_price_cents) as delivery_price_cents,
delivery_easypost_id,
delivery_description,
delivery_date_delivered

@ -925,7 +925,7 @@ begin
return query select * from sos.v_shipment where shipment_uuid = _shipment_uuid;
end; $function$;
create or replace function sos.set_delivery_tracking(_order_uuid uuid, _tracking_number text, _date_shipped timestamptz)
create or replace function sos.set_delivery_tracking(_order_uuid uuid, _tracking_number text, _date_shipped timestamptz, _price_cents integer)
returns setof sos.v_order
language plpgsql
as $function$
@ -955,11 +955,13 @@ begin
insert into sos."delivery_hand_shipped" (
delivery_uuid,
delivery_type,
delivery_price_cents,
delivery_tracking_number,
delivery_date_shipped
) values (
_delivery_uuid,
'hand_shipped',
_price_cents,
_tracking_number,
_date_shipped
);
@ -1019,7 +1021,7 @@ begin
return query select * from sos.v_order where order_uuid = _order_uuid;
end; $function$;
create or replace function sos.set_delivery_easypost(_order_uuid uuid, _easypost_id text, _tracking_number text)
create or replace function sos.set_delivery_easypost(_order_uuid uuid, _easypost_id text, _tracking_number text, _price_cents integer)
returns setof sos.v_order
language plpgsql
as $function$
@ -1044,12 +1046,14 @@ begin
insert into sos."delivery_easypost" (
delivery_uuid,
delivery_type,
delivery_price_cents,
delivery_tracking_number,
delivery_date_shipped,
delivery_easypost_id
) values (
_delivery_uuid,
'easypost',
_price_cents,
_tracking_number,
now(),
_easypost_id

@ -2,7 +2,7 @@ import React, {useState} from 'react'
import Router from 'next/router'
import ActionBar from '~/components/admin/actionBar'
import {FormController, DateInput, Input, Button} from '~/components/form'
import {FormController, DateInput, DecimalInput, Input, Button} from '~/components/form'
EnterTracking.getInitialProps = async ({ctx: {query: {id}}}) => {
return {uuid: id}
@ -17,6 +17,7 @@ export default function EnterTracking({uuid}){
<p>Use this to enter tracking information for packages shipped by-hand (via USPS)</p>
<Input label="Tracking Code" validate={val => val.length > 0} type="text" name="code" hint="Please enter the USPS Tracking code" />
<DateInput label="Ship Date" placeholder="Today" name="date" />
<DecimalInput label="Price" name="price_cents" prefix="$" numDecimals={2} transform={float => Math.floor(float * 100)} />
<Button type="submit">Submit</Button>
</FormController>
</>

@ -37,7 +37,7 @@ export default function Orders({orders}){
{name: 'Purchased', extractor: getPurchaseTime},
{name: 'Items', extractor: getNumberItems},
{name: 'Price', extractor: getItemPrice},
{name: 'Shipping', extractor: getShippingEstimate},
{name: 'Shipping', extractor: getActualShipping},
{name: 'Amount Paid', extractor: getAmountPaid},
{name: '', extractor: row =>
<button className="buttonLink" onClick={() => Router.push(`/admin/orders/${row.id}`)}>Details</button>
@ -72,6 +72,12 @@ function getShippingEstimate(order){
.reduce((a,b)=>(a+b)))
}
function getActualShipping(order) {
if(order.delivery.price_cents)
return formatMoney(order.delivery.price_cents)
return 'N/A'
}
function getAmountPaid(order){
return formatMoney(order.transactions.map(({payments}) => payments.map(payment => payment.value_cents))
.flat()

Loading…
Cancel
Save