Code goes to your active theme’s functions.php file:
1. Remove default invoice charges hook.
remove_action( 'wpcinvoice_after_package_table_row', 'wpcinvoice_after_package_details_callback', 20, 2 );
2. Replace the removed invoice charges hook.
function wpccustom_wpcinvoice_after_package_table_row_callback($shipment){
global $post, $wpcargo;
if( !empty( $shipment ) && wpcinvoice_dashboard_page() == $post->ID ){
$tax = ($wpcargo->tax ?? 0) / 100;
$shipment_type = wpcfe_get_shipment_type( $shipment->ID );
$current_user = wp_get_current_user();
$user_roles = $current_user->roles;
$colspan = count( wpcargo_package_fields() ) - 1;
$pkg_totals = wpcinvoice_get_total_value( $shipment->ID );
$form_control = is_admin() ? '' : 'form-control';
$text_color = '';
$td_width = '';
$nonpq_shiptype = array( 'Shipping Rate', 'Default', 'Delivery', 'Shipment Consolidation' );
$nonins_shiptype = array( 'Default', 'Delivery', 'Shipment Consolidation' );
$non_custom_fields = array('sub_total', 'tax', 'total');
$wpcinvoice_total_fields = wpcinvoice_total_fields();
// unset some array fields based on shipment types
if( $shipment_type == 'Parcel Quotation' ) {
unset( $wpcinvoice_total_fields['insurance'] );
}
if( in_array( $shipment_type, $nonpq_shiptype ) ) {
unset( $wpcinvoice_total_fields['freight'] );
unset( $wpcinvoice_total_fields['fuel'] );
unset( $wpcinvoice_total_fields['stops'] );
unset( $wpcinvoice_total_fields['layover'] );
if( in_array( $shipment_type, $nonins_shiptype ) ) {
unset( $wpcinvoice_total_fields['insurance'] );
}
}
if( $shipment_type == 'Delivery' || $shipment_type == 'Shipment Consolidation' ) {
$td_width = 100;
}
if( array_intersect( array( 'administrator', 'wpcargo_employee' ), $user_roles) ){
if( !empty( $wpcinvoice_total_fields ) ){
foreach( $wpcinvoice_total_fields as $field_key => $fields ){
$invoice_total_field_keys = array_keys( $wpcinvoice_total_fields );
$custom_field_class = '';
$value = array_key_exists( $field_key, $pkg_totals )? $pkg_totals[$field_key] : 0;
$readonly = ( $fields['readonly'] ) ? 'readonly' : '';
$input_id = $field_key;
// change labels based on shipment types
$currency = !empty( wpcinvoice_currency() )? '('.wpcinvoice_currency().')' : '';
$subtotal_label = 'Subtotal '.$currency;
$label = $fields['label'];
if( $label == $subtotal_label && $shipment_type == 'Shipping Rate' ) {
$label = wpcinvoice_shipping_cost_label();
} elseif ( $label == $subtotal_label && $shipment_type == 'Delivery' ) {
$label = wpcinvoice_delivery_charge_label();
}
if( $field_key == 'total' ){
$text_color = ' text-danger';
}
if(!in_array($field_key, $non_custom_fields)){
$custom_field_class = 'custom_fields';
}
?>
<tr class="total-detail">
<td class="label <?php echo $text_color; ?>" colspan="<?php echo $colspan; ?>" align="right" style="vertical-align: middle;"><strong><?php echo $label; ?></strong></td>
<td class="value" colspan="1" width="<?php echo $td_width; ?>">
<?php
printf(
'<input type="%s" id="%s" class="number %s %s" name="%s" value="%s" %s />',
$fields['field'],
$input_id,
$form_control.$text_color,
$custom_field_class,
$field_key,
wpcinvoice_format_value( $value, false ),
$readonly
);
?>
</td>
<?php if( !is_admin() ): ?>
<!-- <td> </td>-->
<?php endif; ?>
</tr>
<?php
}
}
do_action( 'wpcinvoice_additional_details_script' );
}
?>
<script>
jQuery(document).ready(function($){
let tax = "<?php echo $tax; ?>";
$('body').on('input', 'input.custom_fields', function(){
let fields = $('input.custom_fields');
let unitAmountTotal = 0;
let unitAmountTotalTaxed = 0;
let unitAmount = $('input.unit-amount');
unitAmount.each(function(){
let unitAmountVal = $(this).val();
if( unitAmountVal && !isNaN(unitAmountVal)){
unitAmountTotal += parseFloat($(this).val());
}
});
fields.each(function(){
let customFieldVal = $(this).val();
if(customFieldVal && !isNaN(customFieldVal)){ unitAmountTotal += parseFloat(customFieldVal); }
});
unitAmountTotalTaxed = unitAmountTotal * tax;
let total_amount = unitAmountTotal + unitAmountTotalTaxed;
$('#wpcinvoice_package .total-detail').find( 'input#sub_total' ).val( unitAmountTotal.toFixed(2) );
$('#wpcinvoice_package .total-detail').find( 'input#tax' ).val( unitAmountTotalTaxed.toFixed(2) );
$('#wpcinvoice_package .total-detail').find( 'input#total' ).val( total_amount.toFixed(2) );
});
});
</script>
<?php
}
}
add_action('wpcinvoice_after_package_table_row', 'wpccustom_wpcinvoice_after_package_table_row_callback', 20, 1);
3. Add a custom charge field.
function wpccustom_wpcinvoice_total_fields_callback($fields){
$_fields = (array)$fields;
$new_field = array(
'custom_fee' => array(
'label' => __('Custom Fee', 'wpcargo-invoice'),
'field' => 'text',
'required' => false,
'readonly' => false
),
// add new fields here
// 'custom_field' => array( 'label' => __('Custom Field', 'wpcargo-invoice'), 'field' => 'text', 'required' => false, 'readonly' => false )
);
$merged_fields = array_merge($new_field, $_fields);
return $merged_fields;
}
add_filter('wpcinvoice_total_fields', 'wpccustom_wpcinvoice_total_fields_callback', 11, 1);
4. Add saving code for newly added custom charge field.
function wpccustom_after_wpcinvoice_save_shipment_callback($post_id, $data){
$custom_fee = $data['custom_fee'] ?? 0;
// get new fields custom meta here: $custom_field = $data['custom_field'] ?? 0;
if($custom_fee){
update_post_meta($post_id, 'custom_fee', $custom_fee);
}
// update post meta for new fields here
// if($custom_field){ update_post_meta($post_id, 'custom_field', $custom_field); }
}
add_action( 'after_wpcinvoice_save_shipment', 'wpccustom_after_wpcinvoice_save_shipment_callback', 11, 2 );
5. Modify total charges by including the amount of newly added custom charge field.
function wpccustom_wpcinvoice_get_total_value_callback($total_values, $post_id){
global $wpcargo;
$tax = ($wpcargo->tax ?? 0) / 100;
$custom_fee = get_post_meta($post_id, 'custom_fee', true) ?: 0;
// get custom fields meta here: $custom_field = get_post_meta($post_id, 'custom_field', true) ?: 0;
if($custom_fee){
$total_values['custom_fee'] = (float)$custom_fee;
// append new field to total values here: $total_values['custom_field'] = (float)$custom_field;
$total_values['sub_total'] += (float)$custom_fee;
// for multiple fields, the format for sub_total computation will be $total_values['sub_total'] += ((float)$custom_fee + (float)$custom_field);
$total_values['tax'] = (($total_values['sub_total'] ?? 0) * $tax);
$total_values['total'] = (($total_values['sub_total'] ?? 0) + ($total_values['tax'] ?? 0));
}
return $total_values;
}
add_filter('wpcinvoice_get_total_value', 'wpccustom_wpcinvoice_get_total_value_callback', 11, 2);
6. Remove default invoice total fields hook on pdf.
remove_action( 'wpcinvoice_total_info', 'wpcinvoice_total_info_callback', 10, 4 );
7. Replace the removed total fields hook on pdf
function wpccustom_wpcinvoice_total_info_callback( $shipmentDetails ){
$invoice_options = get_option( 'wpcinvoice_settings' );
$shipment_id = $shipmentDetails['shipmentID'];
$shipment_type = wpcfe_get_shipment_type( $shipment_id );
$order_id = wpcinvoice_get_invoice_order( $shipment_id );
$str_find = array_keys( wpcinvoice_shortcodes_list() );
$str_replace = wpcinvoice_replace_shortcodes_list( $shipment_id );
$total_info = wpcinvoice_get_total_value( $shipment_id );
$thankyou_invoice = wpcinvoice_display_options( $invoice_options, 'thankyou_message' );
$subtotal = $order_id ? wc_price( wpcinvoice_get_order_data( $order_id )->subtotal ) : wpcinvoice_format_value( (float)$total_info['sub_total'], true );
$total_tax = $order_id ? wc_price( wpcinvoice_get_order_data( $order_id )->total_tax ) : wpcinvoice_format_value( (float)$total_info['tax'], true );
$total = $order_id ? wc_price( wpcinvoice_get_order_data( $order_id )->total ) : wpcinvoice_format_value( (float)$total_info['total'], true );
if( empty( $thankyou_invoice ) ){
$thankyou_invoice = wpcinvoice_default_thankyou_invoice();
}
// change labels based on shipment types
$subtotal_label = apply_filters( 'wpcinvoice_subtotal_label', __('Subtotal', 'wpcargo-invoice' ) );
if( $shipment_type == 'Shipping Rate' ) {
$subtotal_label = wpcinvoice_pdf_shipping_cost_label();
} elseif ( $shipment_type == 'Delivery' ) {
$subtotal_label = wpcinvoice_pdf_delivery_charge_label();
}
$__net = (float)$total_info['sub_total'] + (float)$total_info['tax'];
// wpcargo_option_settings[wpcargo_tax]
$tax_option = get_option('wpcargo_option_settings');
$__tax = (float)$tax_option['wpcargo_tax'];
$totalNoTax = ( array_sum($total_info ) ) - ( (float)$total_info['tax'] + (float)$total_info['total'] );
// get custom fee
$custom_fee = get_post_meta($shipment_id, 'custom_fee', true) ?: 0;
?>
<thead align = "center" style = "background-color:#cecece;">
<tr style = "padding:0 5px !important;">
<th><?php echo apply_filters( 'charge_description', __( 'Charge Description', 'wpcargo-invoice') ); ?></th>
<!-- custom fee -->
<th><?php echo apply_filters( 'custom_fee_label', __( 'Custom Fee', 'wpcargo-invoice') ); ?></th>
<th><?php echo apply_filters( 'gross_charges', __( 'Gross Charge', 'wpcargo-invoice') ); ?></th>
<th><?php echo apply_filters( '__tax', __( 'Tax (%)', 'wpcargo-invoice') ); ?></th>
<th><?php echo apply_filters( 'tax', __( 'Tax', 'wpcargo-invoice') ); ?></th>
<th><?php echo apply_filters( 'net_charges', __( 'Net Charge', 'wpcargo-invoice') ); ?></th>
</tr>
</thead>
<tbody>
<tr align = "center" style = "padding:0 5px !important;">
<td class="no-padding" align = "left" style = "padding:0 5px !important;"><?php echo $subtotal_label; ?></td>
<!-- custom fee -->
<td class="no-padding"><?php echo wpcinvoice_format_value( ( (float)$custom_fee ), true ); ?></td>
<td class="no-padding"><?php echo wpcinvoice_format_value( ( (float)$total_info['sub_total'] ?: 0.00 ), true ); ?></td>
<td class="no-padding"><?php echo $__tax; ?></td>
<td class="no-padding"><?php echo wpcinvoice_format_value( ( (float)$total_info['tax'] ?: 0.00 ), true ); ?></td>
<td class="no-padding"><?php echo wpcinvoice_format_value( ( (float)$__net ?: 0.00 ), true ); ?></td></div>
</tr>
<?php do_action( 'wpcinvoice_after_invoice_tax', $total_info, $shipment_id, $shipment_type ); ?>
<tr align = "center" style = "padding:0 5px !important;">
<td class="no-padding" align = "left" style = "padding:0 5px !important;"><strong style="font-size: 20px;"><?php echo apply_filters( 'wpcinvoice_total_label', __('Total', 'wpcargo-invoice' ) ); ?></strong></td>
<!-- custom fee -->
<td class="no-padding"><strong style="font-size: 20px;"><?php echo wpcinvoice_format_value( ( (float)$custom_fee ), true ); ?></strong></td>
<td class="no-padding"><strong style="font-size: 20px;"><?php echo $totalNoTax; ?></strong></td>
<td class="no-padding"> </td>
<td class="no-padding"><strong style="font-size: 20px;"><?php echo wpcinvoice_format_value( ( (float)$total_info['tax'] ?: 0.00 ), true ); ?></strong></td>
<td class="no-padding"><span><strong style="font-size: 20px;"><?php echo wpcinvoice_format_value( ( (float)$total_info['total'] ?: 0.00 ), true ); ?></strong></span></td>
</tr>
</tbody>
<?php
}
add_action( 'wpcinvoice_total_info', 'wpccustom_wpcinvoice_total_info_callback', 10, 4 );

