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",
"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": {
"context": "Amount error message",
"string": "Amount cannot be bigger than max refund"

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -47,8 +47,8 @@ export interface OrderReturnHandlers {
export interface OrderReturnFormData extends OrderReturnData {
itemsToBeReplaced: FormsetReplacementData;
fulfiledItemsQuantities: FormsetQuantityData;
unfulfiledItemsQuantities: FormsetQuantityData;
fulfilledItemsQuantities: FormsetQuantityData;
unfulfilledItemsQuantities: FormsetQuantityData;
}
export type OrderRefundSubmitData = OrderReturnFormData;
@ -184,9 +184,9 @@ function useOrderReturnForm(
};
const data: OrderReturnFormData = {
fulfiledItemsQuantities: fulfiledItemsQuatities.data,
fulfilledItemsQuantities: fulfiledItemsQuatities.data,
itemsToBeReplaced: itemsToBeReplaced.data,
unfulfiledItemsQuantities: unfulfiledItemsQuantites.data,
unfulfilledItemsQuantities: unfulfiledItemsQuantites.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 },
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 },
id: "4",
@ -861,8 +861,8 @@ describe("Get the total value of all replaced products", () => {
},
{
itemsToBeReplaced,
unfulfiledItemsQuantities,
fulfiledItemsQuantities
unfulfilledItemsQuantities,
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",
label: null,
value: 0
},
{
data: null,
data: { isFulfillment: false, isRefunded: false },
id: "2",
label: null,
value: 2
},
{
data: null,
data: { isFulfillment: false, isRefunded: false },
id: "3",
label: null,
value: 1
}
];
const fulfiledItemsQuantities: FormsetData<null, number> = [
const fulfilledItemsQuantities: FormsetData<LineItemData, number> = [
{
data: null,
data: { isFulfillment: true, isRefunded: false },
id: "4",
label: null,
value: 4
},
{
data: null,
data: { isFulfillment: true, isRefunded: false },
id: "5",
label: null,
value: 0
},
{
data: null,
data: { isFulfillment: true, isRefunded: false },
id: "6",
label: null,
value: 3
@ -1196,8 +1196,8 @@ describe("Get the total value of all selected products", () => {
},
{
itemsToBeReplaced,
unfulfiledItemsQuantities,
fulfiledItemsQuantities
unfulfilledItemsQuantities,
fulfilledItemsQuantities
}
);

View file

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

View file

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