Merge pull request #955 from mirumee/super-duper-urgent-return-fixes-again

Return fixes
This commit is contained in:
mmarkusik 2021-01-22 11:02:20 +01:00 committed by GitHub
commit e74225b570
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 96 additions and 62 deletions

View file

@ -3839,6 +3839,10 @@
"context": "checkbox", "context": "checkbox",
"string": "Refund shipment costs" "string": "Refund shipment costs"
}, },
"src_dot_orders_dot_components_dot_OrderRefundReturnAmount_dot_982301568": {
"context": "label",
"string": "No refund"
},
"src_dot_orders_dot_components_dot_OrderRefundReturnAmount_dot_amountTooBig": { "src_dot_orders_dot_components_dot_OrderRefundReturnAmount_dot_amountTooBig": {
"context": "Amount error message", "context": "Amount error message",
"string": "Amount cannot be bigger than max refund" "string": "Amount cannot be bigger than max refund"

View file

@ -25,7 +25,6 @@ const useStyles = makeStyles(
paddingTop: theme.spacing(2) paddingTop: theme.spacing(2)
}, },
"&.Mui-expanded": { "&.Mui-expanded": {
borderColor: "red",
margin: 0, margin: 0,
minHeight: 0 minHeight: 0
}, },
@ -48,7 +47,7 @@ const useStyles = makeStyles(
"&> .MuiExpansionPanelSummary-expandIcon": { "&> .MuiExpansionPanelSummary-expandIcon": {
padding: 0, padding: 0,
position: "absolute", position: "absolute",
right: theme.spacing(18) right: theme.spacing(20)
}, },
margin: 0, margin: 0,
minHeight: 0, minHeight: 0,

View file

@ -14,7 +14,8 @@ export enum OrderRefundType {
} }
export enum OrderRefundAmountCalculationMode { export enum OrderRefundAmountCalculationMode {
AUTOMATIC = "automatic", AUTOMATIC = "automatic",
MANUAL = "manual" MANUAL = "manual",
NONE = "none"
} }
export interface OrderRefundData { export interface OrderRefundData {

View file

@ -82,6 +82,7 @@ interface OrderRefundAmountProps {
isReturn?: boolean; isReturn?: boolean;
errors: OrderErrorFragment[]; errors: OrderErrorFragment[];
amountData: OrderRefundAmountValuesProps; amountData: OrderRefundAmountValuesProps;
allowNoRefund?: boolean;
onChange: (event: React.ChangeEvent<any>) => void; onChange: (event: React.ChangeEvent<any>) => void;
onRefund: () => void; onRefund: () => void;
} }
@ -96,7 +97,8 @@ const OrderRefundAmount: React.FC<OrderRefundAmountProps> = props => {
onRefund, onRefund,
isReturn = false, isReturn = false,
amountData, amountData,
disableSubmitButton disableSubmitButton,
allowNoRefund = false
} = props; } = props;
const classes = useStyles(props); const classes = useStyles(props);
const intl = useIntl(); const intl = useIntl();
@ -144,6 +146,17 @@ const OrderRefundAmount: React.FC<OrderRefundAmountProps> = props => {
onChange={onChange} onChange={onChange}
name="amountCalculationMode" name="amountCalculationMode"
> >
{allowNoRefund && (
<FormControlLabel
disabled={disabled}
value={OrderRefundAmountCalculationMode.NONE}
control={<Radio color="primary" />}
label={intl.formatMessage({
defaultMessage: "No refund",
description: "label"
})}
/>
)}
<FormControlLabel <FormControlLabel
disabled={disabled} disabled={disabled}
value={OrderRefundAmountCalculationMode.AUTOMATIC} value={OrderRefundAmountCalculationMode.AUTOMATIC}
@ -153,6 +166,18 @@ const OrderRefundAmount: React.FC<OrderRefundAmountProps> = props => {
description: "label" description: "label"
})} })}
/> />
{data.amountCalculationMode ===
OrderRefundAmountCalculationMode.NONE && (
<>
<CardSpacer />
<OrderRefundAmountValues
authorizedAmount={authorizedAmount}
previouslyRefunded={previouslyRefunded}
maxRefund={maxRefund}
shipmentCost={data.refundShipmentCosts && shipmentCost}
/>
</>
)}
{data.amountCalculationMode === {data.amountCalculationMode ===
OrderRefundAmountCalculationMode.AUTOMATIC && ( OrderRefundAmountCalculationMode.AUTOMATIC && (
<> <>

View file

@ -149,8 +149,8 @@ export const getReturnProductsAmountValues = (
const authorizedAmount = getAuthorizedAmount(order); const authorizedAmount = getAuthorizedAmount(order);
const { const {
fulfiledItemsQuantities, fulfilledItemsQuantities,
unfulfiledItemsQuantities, unfulfilledItemsQuantities,
refundShipmentCosts refundShipmentCosts
} = formData; } = formData;
@ -177,8 +177,8 @@ export const getReturnProductsAmountValues = (
return { return {
...getProductsAmountValues( ...getProductsAmountValues(
order, order,
fulfiledItemsQuantities, fulfilledItemsQuantities,
unfulfiledItemsQuantities, unfulfilledItemsQuantities,
refundShipmentCosts refundShipmentCosts
), ),
refundTotalAmount, refundTotalAmount,

View file

@ -46,11 +46,11 @@ const OrderRefundPage: React.FC<OrderReturnPageProps> = props => {
return ( return (
<OrderRefundForm order={order} onSubmit={onSubmit}> <OrderRefundForm order={order} onSubmit={onSubmit}>
{({ data, handlers, change, submit }) => { {({ data, handlers, change, submit }) => {
const { fulfiledItemsQuantities, unfulfiledItemsQuantities } = data; const { fulfilledItemsQuantities, unfulfilledItemsQuantities } = data;
const hasAnyItemsSelected = const hasAnyItemsSelected =
fulfiledItemsQuantities.some(({ value }) => !!value) || fulfilledItemsQuantities.some(({ value }) => !!value) ||
unfulfiledItemsQuantities.some(({ value }) => !!value); unfulfilledItemsQuantities.some(({ value }) => !!value);
return ( return (
<Container> <Container>
@ -66,13 +66,13 @@ const OrderRefundPage: React.FC<OrderReturnPageProps> = props => {
/> />
<Grid> <Grid>
<div> <div>
{!!data.unfulfiledItemsQuantities.length && ( {!!data.unfulfilledItemsQuantities.length && (
<> <>
<ItemsCard <ItemsCard
errors={errors} errors={errors}
order={order} order={order}
lines={getUnfulfilledLines(order)} lines={getUnfulfilledLines(order)}
itemsQuantities={data.unfulfiledItemsQuantities} itemsQuantities={data.unfulfilledItemsQuantities}
itemsSelections={data.itemsToBeReplaced} itemsSelections={data.itemsToBeReplaced}
onChangeQuantity={handlers.changeUnfulfiledItemsQuantity} onChangeQuantity={handlers.changeUnfulfiledItemsQuantity}
onSetMaxQuantity={ onSetMaxQuantity={
@ -92,7 +92,7 @@ const OrderRefundPage: React.FC<OrderReturnPageProps> = props => {
order={order} order={order}
fulfilmentId={id} fulfilmentId={id}
lines={getParsedFulfiledLines(lines)} lines={getParsedFulfiledLines(lines)}
itemsQuantities={data.fulfiledItemsQuantities} itemsQuantities={data.fulfilledItemsQuantities}
itemsSelections={data.itemsToBeReplaced} itemsSelections={data.itemsToBeReplaced}
onChangeQuantity={handlers.changeFulfiledItemsQuantity} onChangeQuantity={handlers.changeFulfiledItemsQuantity}
onSetMaxQuantity={handlers.handleSetMaximalFulfiledItemsQuantities( onSetMaxQuantity={handlers.handleSetMaximalFulfiledItemsQuantities(
@ -107,6 +107,7 @@ const OrderRefundPage: React.FC<OrderReturnPageProps> = props => {
</div> </div>
<div> <div>
<OrderAmount <OrderAmount
allowNoRefund
isReturn isReturn
amountData={getReturnProductsAmountValues(order, data)} amountData={getReturnProductsAmountValues(order, data)}
data={data} data={data}

View file

@ -47,8 +47,8 @@ export interface OrderReturnHandlers {
export interface OrderReturnFormData extends OrderReturnData { export interface OrderReturnFormData extends OrderReturnData {
itemsToBeReplaced: FormsetReplacementData; itemsToBeReplaced: FormsetReplacementData;
fulfiledItemsQuantities: FormsetQuantityData; fulfilledItemsQuantities: FormsetQuantityData;
unfulfiledItemsQuantities: FormsetQuantityData; unfulfilledItemsQuantities: FormsetQuantityData;
} }
export type OrderRefundSubmitData = OrderReturnFormData; export type OrderRefundSubmitData = OrderReturnFormData;
@ -184,9 +184,9 @@ function useOrderReturnForm(
}; };
const data: OrderReturnFormData = { const data: OrderReturnFormData = {
fulfiledItemsQuantities: fulfiledItemsQuatities.data, fulfilledItemsQuantities: fulfiledItemsQuatities.data,
itemsToBeReplaced: itemsToBeReplaced.data, itemsToBeReplaced: itemsToBeReplaced.data,
unfulfiledItemsQuantities: unfulfiledItemsQuantites.data, unfulfilledItemsQuantities: unfulfiledItemsQuantites.data,
...form.data ...form.data
}; };

View file

@ -738,7 +738,7 @@ describe("Get the total value of all replaced products", () => {
} }
]; ];
const unfulfiledItemsQuantities: FormsetData<LineItemData, number> = [ const unfulfilledItemsQuantities: FormsetData<LineItemData, number> = [
{ {
data: { isFulfillment: false, isRefunded: false }, data: { isFulfillment: false, isRefunded: false },
id: "1", id: "1",
@ -759,7 +759,7 @@ describe("Get the total value of all replaced products", () => {
} }
]; ];
const fulfiledItemsQuantities: FormsetData<LineItemData, number> = [ const fulfilledItemsQuantities: FormsetData<LineItemData, number> = [
{ {
data: { isFulfillment: true, isRefunded: false }, data: { isFulfillment: true, isRefunded: false },
id: "4", id: "4",
@ -861,8 +861,8 @@ describe("Get the total value of all replaced products", () => {
}, },
{ {
itemsToBeReplaced, itemsToBeReplaced,
unfulfiledItemsQuantities, unfulfilledItemsQuantities,
fulfiledItemsQuantities fulfilledItemsQuantities
} }
); );
@ -1085,42 +1085,42 @@ describe("Get the total value of all selected products", () => {
} }
]; ];
const unfulfiledItemsQuantities: FormsetData<null, number> = [ const unfulfilledItemsQuantities: FormsetData<LineItemData, number> = [
{ {
data: null, data: { isFulfillment: false, isRefunded: false },
id: "1", id: "1",
label: null, label: null,
value: 0 value: 0
}, },
{ {
data: null, data: { isFulfillment: false, isRefunded: false },
id: "2", id: "2",
label: null, label: null,
value: 2 value: 2
}, },
{ {
data: null, data: { isFulfillment: false, isRefunded: false },
id: "3", id: "3",
label: null, label: null,
value: 1 value: 1
} }
]; ];
const fulfiledItemsQuantities: FormsetData<null, number> = [ const fulfilledItemsQuantities: FormsetData<LineItemData, number> = [
{ {
data: null, data: { isFulfillment: true, isRefunded: false },
id: "4", id: "4",
label: null, label: null,
value: 4 value: 4
}, },
{ {
data: null, data: { isFulfillment: true, isRefunded: false },
id: "5", id: "5",
label: null, label: null,
value: 0 value: 0
}, },
{ {
data: null, data: { isFulfillment: true, isRefunded: false },
id: "6", id: "6",
label: null, label: null,
value: 3 value: 3
@ -1196,8 +1196,8 @@ describe("Get the total value of all selected products", () => {
}, },
{ {
itemsToBeReplaced, itemsToBeReplaced,
unfulfiledItemsQuantities, unfulfilledItemsQuantities,
fulfiledItemsQuantities fulfilledItemsQuantities
} }
); );

View file

@ -53,8 +53,8 @@ const getItemPriceAndQuantity = ({
const selectItemPriceAndQuantity = ( const selectItemPriceAndQuantity = (
order: OrderDetails_order, order: OrderDetails_order,
{ {
fulfiledItemsQuantities, fulfilledItemsQuantities,
unfulfiledItemsQuantities unfulfilledItemsQuantities
}: Partial<OrderReturnFormData>, }: Partial<OrderReturnFormData>,
id: string, id: string,
isFulfillment: boolean isFulfillment: boolean
@ -62,12 +62,12 @@ const selectItemPriceAndQuantity = (
isFulfillment isFulfillment
? getItemPriceAndQuantity({ ? getItemPriceAndQuantity({
id, id,
itemsQuantities: fulfiledItemsQuantities, itemsQuantities: fulfilledItemsQuantities,
orderLines: getAllOrderFulfilledLines(order) orderLines: getAllOrderFulfilledLines(order)
}) })
: getItemPriceAndQuantity({ : getItemPriceAndQuantity({
id, id,
itemsQuantities: unfulfiledItemsQuantities, itemsQuantities: unfulfilledItemsQuantities,
orderLines: order.lines orderLines: order.lines
}); });
@ -75,8 +75,8 @@ export const getReplacedProductsAmount = (
order: OrderDetails_order, order: OrderDetails_order,
{ {
itemsToBeReplaced, itemsToBeReplaced,
unfulfiledItemsQuantities, unfulfilledItemsQuantities,
fulfiledItemsQuantities fulfilledItemsQuantities
}: Partial<OrderReturnFormData> }: Partial<OrderReturnFormData>
) => { ) => {
if (!order || !itemsToBeReplaced.length) { if (!order || !itemsToBeReplaced.length) {
@ -94,7 +94,7 @@ export const getReplacedProductsAmount = (
const { unitPrice, selectedQuantity } = selectItemPriceAndQuantity( const { unitPrice, selectedQuantity } = selectItemPriceAndQuantity(
order, order,
{ fulfiledItemsQuantities, unfulfiledItemsQuantities }, { fulfilledItemsQuantities, unfulfilledItemsQuantities },
id, id,
isFulfillment isFulfillment
); );
@ -107,20 +107,20 @@ export const getReplacedProductsAmount = (
export const getReturnSelectedProductsAmount = ( export const getReturnSelectedProductsAmount = (
order: OrderDetails_order, order: OrderDetails_order,
{ itemsToBeReplaced, unfulfiledItemsQuantities, fulfiledItemsQuantities } { itemsToBeReplaced, unfulfilledItemsQuantities, fulfilledItemsQuantities }
) => { ) => {
if (!order) { if (!order) {
return 0; return 0;
} }
const unfulfilledItemsValue = getPartialProductsValue({ const unfulfilledItemsValue = getPartialProductsValue({
itemsQuantities: unfulfiledItemsQuantities, itemsQuantities: unfulfilledItemsQuantities,
itemsToBeReplaced, itemsToBeReplaced,
orderLines: order.lines orderLines: order.lines
}); });
const fulfiledItemsValue = getPartialProductsValue({ const fulfiledItemsValue = getPartialProductsValue({
itemsQuantities: fulfiledItemsQuantities, itemsQuantities: fulfilledItemsQuantities,
itemsToBeReplaced, itemsToBeReplaced,
orderLines: getAllOrderFulfilledLines(order) orderLines: getAllOrderFulfilledLines(order)
}); });
@ -137,24 +137,24 @@ const getPartialProductsValue = ({
itemsQuantities: FormsetData<LineItemData, number>; itemsQuantities: FormsetData<LineItemData, number>;
orderLines: OrderDetails_order_lines[]; orderLines: OrderDetails_order_lines[];
}) => }) =>
itemsQuantities.reduce((resultAmount, { id, value: quantity }) => { itemsQuantities.reduce(
const { (resultAmount, { id, value: quantity, data: { isRefunded } }) => {
value: isItemToBeReplaced, const { value: isItemToBeReplaced } = itemsToBeReplaced.find(getById(id));
data: { isRefunded }
} = itemsToBeReplaced.find(getById(id));
if (quantity < 1 || isItemToBeReplaced || isRefunded) { if (quantity < 1 || isItemToBeReplaced || isRefunded) {
return resultAmount; return resultAmount;
} }
const { selectedQuantity, unitPrice } = getItemPriceAndQuantity({ const { selectedQuantity, unitPrice } = getItemPriceAndQuantity({
id, id,
itemsQuantities, itemsQuantities,
orderLines orderLines
}); });
return resultAmount + unitPrice.gross.amount * selectedQuantity; return resultAmount + unitPrice.gross.amount * selectedQuantity;
}, 0); },
0
);
export function getRefundedLinesPriceSum( export function getRefundedLinesPriceSum(
lines: OrderRefundData_order_lines[], lines: OrderRefundData_order_lines[],

View file

@ -23,17 +23,17 @@ class ReturnFormDataParser {
public getParsedData = (): OrderReturnProductsInput => { public getParsedData = (): OrderReturnProductsInput => {
const { const {
fulfiledItemsQuantities, fulfilledItemsQuantities,
unfulfiledItemsQuantities, unfulfilledItemsQuantities,
refundShipmentCosts refundShipmentCosts
} = this.formData; } = this.formData;
const fulfillmentLines = this.getParsedLineData< const fulfillmentLines = this.getParsedLineData<
OrderReturnFulfillmentLineInput OrderReturnFulfillmentLineInput
>(fulfiledItemsQuantities, "fulfillmentLineId"); >(fulfilledItemsQuantities, "fulfillmentLineId");
const orderLines = this.getParsedLineData<OrderReturnLineInput>( const orderLines = this.getParsedLineData<OrderReturnLineInput>(
unfulfiledItemsQuantities, unfulfilledItemsQuantities,
"orderLineId" "orderLineId"
); );
@ -78,7 +78,11 @@ class ReturnFormDataParser {
orderLines: OrderReturnLineInput[], orderLines: OrderReturnLineInput[],
fulfillmentLines: OrderReturnFulfillmentLineInput[] fulfillmentLines: OrderReturnFulfillmentLineInput[]
) => { ) => {
if (!this.order.totalCaptured?.amount) { if (
!this.order.totalCaptured?.amount ||
this.formData.amountCalculationMode ===
OrderRefundAmountCalculationMode.NONE
) {
return false; return false;
} }