1
0
mirror of https://github.com/PanJiaChen/vue-element-admin.git synced 2025-08-07 18:25:45 +08:00

Support Assign PO-Invoice-Receipt-Invoice (#960)

* setting up initial structure

* add service

Co-authored-by: elsiosanchez <elsiossanches@gmail.com>
This commit is contained in:
Elsio Sanchez 2021-08-06 21:23:47 -04:00 committed by GitHub
parent d6e490a4e3
commit 5a5f32d934
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 1177 additions and 52 deletions

View File

@ -33,5 +33,8 @@
},
"priceChecking": {
"endpoint": "/form/addons/point-of-sales"
},
"match": {
"endpoint": "/form/addons/match"
}
}

76
package-lock.json generated
View File

@ -2861,56 +2861,6 @@
"object.getownpropertydescriptors": "^2.0.3"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.3.3",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.3.3.tgz",
"integrity": "sha512-/1GzCuQ6MRORbC+leKTKoTGtpQt60bYe0gDGEextSteA2OM+v201FPha5jzmjQzVhRcwieZeUvezAtG5a/e5cw==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
"dev": true,
"optional": true
},
"emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"dev": true,
"optional": true
},
"json5": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
"dev": true,
"optional": true,
"requires": {
"minimist": "^1.2.5"
}
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
}
}
},
"wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@ -17933,6 +17883,32 @@
}
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.5.0",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.5.0.tgz",
"integrity": "sha512-WXh+7AgFxGTgb5QAkQtFeUcHNIEq3PGVQ8WskY5ZiFbWBkOwcCPRs4w/2tVyTbh2q6TVRlO3xfvIukUtjsu62A==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
}
}
},
"vue-multipane": {
"version": "0.9.5",
"resolved": "https://registry.npmjs.org/vue-multipane/-/vue-multipane-0.9.5.tgz",

View File

@ -0,0 +1,75 @@
// ADempiere-Vue (Frontend) for ADempiere ERP & CRM Smart Business Solution
// Copyright (C) 2017-Present E.R.P. Consultores y Asociados, C.A.
// Contributor(s): Elsio Sanchez elsiosanches@gmail.com www.erpya.com
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// Get Instance for connectionimport {
import { request } from '@/utils/ADempiere/request'
import { config } from '@/utils/ADempiere/config'
// Receipts List
export function receipts({
businessPartnerUuid,
formUuid
}) {
return request({
url: `${config.match.endpoint}/receipts`,
method: 'get',
params: {
business_partner_uuid: businessPartnerUuid,
form_uuid: formUuid
}
})
.then(receiptsListResponse => {
return receiptsListResponse
})
}
// Invoices List
export function invoces({
businessPartnerUuid,
formUuid
}) {
return request({
url: `${config.match.endpoint}/invoices`,
method: 'get',
params: {
business_partner_uuid: businessPartnerUuid,
form_uuid: formUuid
}
})
.then(invocesListResponse => {
return invocesListResponse
})
}
// Process Receipt
export function processReceipt({
businessPartnerUuid,
receiptUuid,
invoceUuid,
formUuid
}) {
return request({
url: `${config.match.endpoint}/process-receipt`,
method: 'post',
params: {
business_partner_uuid: businessPartnerUuid,
receipt_uuid: receiptUuid,
invoce_uuid: invoceUuid,
form_uuid: formUuid
}
})
.then(response => {
return response
})
}

View File

@ -27,7 +27,7 @@
{{ item.description }}
</p>
</div>
<div class="text item" style="height: 95%;">
<div class="text item" style="height: 90%;overflow: auto;">
<slot />
</div>
</el-card>

View File

@ -0,0 +1,55 @@
<!--
ADempiere-Vue (Frontend) for ADempiere ERP & CRM Smart Business Solution
Copyright (C) 2017-Present E.R.P. Consultores y Asociados, C.A.
Contributor(s): Elsio Sanchez elsiosanchez@erpya.com www.erpya.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https:www.gnu.org/licenses/>.
-->
<template>
<el-tabs type="border-card">
<el-tab-pane :label="$t('form.match.title.invoice')">
<table-from
:ref-table="ref"
:label="labelTable"
:records-data="invoiceList"
:selection="selectedInvoice"
:add-selection="selectInvoice"
:is-selection="true"
/>
</el-tab-pane>
</el-tabs>
</template>
<script>
import tableFrom from '../tableFrom'
import labelTable from '@/components/ADempiere/Form/VMatch/labelTable.js'
export default {
name: 'Invoices',
components: {
tableFrom
},
data() {
return {
labelTable,
ref: 'Match',
selectInvoice: 'selectedInvoceMatch'
}
},
computed: {
invoiceList() {
return this.$store.getters.getInvoiceMatch
},
selectedInvoice() {
return this.$store.getters.getSelectedInvoceMatch
}
}
}
</script>

View File

@ -0,0 +1,171 @@
<!--
ADempiere-Vue (Frontend) for ADempiere ERP & CRM Smart Business Solution
Copyright (C) 2017-Present E.R.P. Consultores y Asociados, C.A.
Contributor(s): Elsio Sanchez elsiosanchez@erpya.com www.erpya.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https:www.gnu.org/licenses/>.
-->
<template>
<div>
<el-tabs v-if="!isEmptyValue(selectedInvoice)" type="border-card">
<el-tab-pane :label="$t('form.match.title.invoice')">
<table-from
:label="labelTable"
:records-data="selectedInvoice"
:selection="selectedInvoice"
:is-selection="true"
/>
</el-tab-pane>
</el-tabs>
<el-tabs type="border-card">
<el-tab-pane :label="$t('form.match.title.deliveryReceipt')">
<br>
<el-row>
<template
v-for="(option, index) in filtersSearch"
>
<el-col :key="index" :span="4">
<el-checkbox v-model="option.value" :label="option.label" />
</el-col>
</template>
</el-row>
<br>
<table-from
:ref-table="ref"
:label="labelTable"
:records-data="receiptsList"
:selection="selectedReceipts"
:add-selection="selectReceipt"
:multi-selection="true"
/>
</el-tab-pane>
</el-tabs>
<el-form :inline="true" label-position="top" class="demo-form-inline">
<template
v-for="(item, index) in field"
>
<el-form-item :key="index" :label="item.label" style="width: 30%;text-align: center;">
<el-input-number v-model="item.value" :controls="false" disabled />
</el-form-item>
</template>
</el-form>
</div>
</template>
<script>
import tableFrom from '../tableFrom'
import labelTable from '@/components/ADempiere/Form/VMatch/labelTable.js'
export default {
name: 'Receipt',
components: {
tableFrom
},
data() {
return {
labelTable,
key: 0,
field: [
{
label: this.$t('form.match.field.toAssigned'),
value: 0
},
{
label: this.$t('form.match.field.assigning'),
value: 0
},
{
label: this.$t('form.match.field.difference'),
value: 0
}
],
filtersSearch: [
{
label: this.$t('form.match.filtersSearch.sameBusinessPartner'),
columnName: 'C_BPartner_ID',
value: false
},
{
label: this.$t('form.match.filtersSearch.sameProduct'),
columnName: 'product',
value: false
},
{
label: this.$t('form.match.filtersSearch.sameQuantity'),
columnName: 'quantity',
value: false
}
],
ref: 'Receipt',
selectReceipt: 'selectedelectedReceiptsMatch'
}
},
computed: {
receiptsList() {
let receipts = this.$store.getters.getInvoiceMatch
this.filtersSearch.forEach(filter => {
if (filter.value) {
receipts = this.filterBills(receipts, filter)
}
})
return receipts
},
selectedInvoice() {
return this.$store.getters.getSelectedInvoceMatch
},
selectedReceipts() {
return this.$store.getters.getSelectedReceiptsMatch
}
},
watch: {
selectedReceipts(value) {
this.assignmentSummary({
toAssigned: this.field[this.key],
assigning: this.field[1],
difference: this.field[2],
quantity: this.selectedInvoice[this.key].quantity
})
}
},
mounted() {
if (!this.isEmptyValue(this.selectedInvoice)) {
this.assignmentSummary({
toAssigned: this.field[this.key],
assigning: this.field[1],
difference: this.field[2],
quantity: this.selectedInvoice[this.key].quantity
})
}
},
methods: {
sumQuantity(cash) {
let sum = 0
if (cash) {
cash.forEach((pay) => {
sum += pay.quantity
})
}
return sum
},
filterBills(recordList, element) {
return recordList.filter(record => {
if (record[element.columnName] === this.selectedInvoice[this.key][element.columnName]) {
return record
}
})
},
assignmentSummary({ toAssigned, assigning, difference, quantity }) {
toAssigned.value = quantity
assigning.value = this.sumQuantity(this.selectedReceipts)
difference.value = toAssigned.value - this.sumQuantity(this.selectedReceipts)
}
}
}
</script>

View File

@ -0,0 +1,48 @@
<!--
ADempiere-Vue (Frontend) for ADempiere ERP & CRM Smart Business Solution
Copyright (C) 2017-Present E.R.P. Consultores y Asociados, C.A.
Contributor(s): Elsio Sanchez elsiosanchez@erpya.com www.erpya.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https:www.gnu.org/licenses/>.
-->
<template>
<el-form v-if="!isEmptyValue(metadata)" label-position="top" class="from-main">
<el-form-item>
<el-row>
<el-col v-for="(field, index) in metadata" :key="index" :span="6">
<field
:key="field.columnName"
:metadata-field="field"
:v-model="field.value"
/>
</el-col>
</el-row>
</el-form-item>
</el-form>
</template>
<script>
import Field from '@/components/ADempiere/Field'
export default {
name: 'SearchCriteria',
components: {
Field
},
props: {
metadata: {
type: Array,
required: true,
default: () => []
}
}
}
</script>

View File

@ -0,0 +1,211 @@
<!--
ADempiere-Vue (Frontend) for ADempiere ERP & CRM Smart Business Solution
Copyright (C) 2017-Present E.R.P. Consultores y Asociados, C.A.
Contributor(s): Elsio Sanchez elsiosanchez@erpya.com www.erpya.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https:www.gnu.org/licenses/>.
-->
<template>
<div
class="card-form"
style="height: 100%;overflow: auto;"
>
<el-table
:ref="refTable"
:data="recordsData"
style="width: 100%;height: 100%;overflow: auto;"
border
highlight-current-row
:show-summary="summary"
:summary-method="getSummaries"
:row-class-name="styleCell ? tableRowClassName : ''"
@select="handleSelectionChange"
@select-all="handleSelectionChange"
@current-change="handleCurrentChange"
>
<el-table-column
v-if="multiSelection"
type="selection"
width="50"
/>
<el-table-column
v-else
:type="multiSelection ? 'selection' : ''"
width="50"
>
<template v-if="selection && currentRow.nrDocument === scope.row.nrDocument" slot-scope="scope">
<i :class="currentRow.icon" />
</template>
</el-table-column>
<el-table-column
v-for="(valueOrder) in label"
:key="valueOrder.columnName"
:column-key="valueOrder.columnName"
:label="valueOrder.label"
width="auto"
:min-width="!valueOrder.isNumeric ? valueOrder.size : valueOrder.size"
:align="valueOrder.isNumeric ? 'right' : 'left'"
:prop="valueOrder.columnName"
:sortable="valueOrder.isNumeric"
/>
</el-table>
</div>
</template>
<script>
import { formatPrice } from '@/utils/ADempiere/valueFormat.js'
export default {
name: 'TableFrom',
props: {
refTable: {
type: String,
default: 'TableFrom'
},
label: {
type: Array,
default: () => []
},
recordsData: {
type: Array,
default: () => []
},
height: {
type: String,
default: ''
},
styleCell: {
type: Boolean,
default: false
},
isSelection: {
type: Boolean,
default: false
},
selection: {
type: Array,
default: () => []
},
addSelection: {
type: String,
default: ''
},
multiSelection: {
type: Boolean,
default: false
},
summary: {
type: Boolean,
default: false
}
},
data() {
return {
currentRow: {
icon: 'el-icon-check'
}
}
},
watch: {
selection(row) {
this.currentRow = {
...this.currentRow,
...row[0]
}
}
},
mounted() {
this.toggleSelection(this.selection)
this.setCurrent(this.selection[0])
},
methods: {
formatPrice,
handleSelectionChange(selection, row) {
this.$store.dispatch(this.addSelection, selection)
},
setCurrent(row) {
this.currentRow = {
...this.currentRow,
...row
}
},
handleCurrentChange(val) {
this.currentRow = {
...this.currentRow,
val
}
if (this.isSelection) {
this.$store.dispatch(this.addSelection, [val])
}
},
toggleSelection(rows) {
if (rows) {
rows.forEach(row => {
const selectionRow = this.recordsData.find(record => record.NrDocument === row.NrDocument)
this.$refs[this.refTable].toggleRowSelection(selectionRow)
})
} else {
this.$refs[this.refTable].clearSelection()
}
},
tableRowClassName({ row, rowIndex }) {
if (row.Difference > 0) {
'success-row'
}
return 'warning-row'
},
getSummaries(param) {
const { columns } = param
const sums = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = 'Σ'
return
}
const values = this.selection.map(item => {
if (column.sortable) {
return Number(item[column.property])
} else {
return ''
}
})
if (values.every(value => value > 0) && !this.isEmptyValue(this.selection)) {
sums[index] = this.formatPrice(values.reduce((prev, curr) => {
const value = Number(curr)
if (!isNaN(value)) {
return prev + curr
} else {
return prev
}
}, 0))
} else {
sums[index] = ''
}
})
return sums
}
}
}
</script>
<style lang="scss" scoped>
.card-form {
height: 100% !important;
overflow: auto;
}
</style>
<style>
.el-table .warning-row {
background:#ff4949a6;
}
.el-table .success-row {
background: #8ff6bd80;
}
</style>

View File

@ -0,0 +1,134 @@
// ADempiere-Vue (Frontend) for ADempiere ERP & CRM Smart Business Solution
// Copyright (C) 2017-Present E.R.P. Consultores y Asociados, C.A.
// Contributor(s): Elsio Sanchez elsiosanches@gmail.com www.erpya.com
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// List of fields to send in search
// import language from '@/lang'
export default [
{
columnName: 'C_BPartner_ID',
tableName: 'M_InOut',
isFromDictionary: true,
overwriteDefinition: {
handleFocusGained: true,
handleFocusLost: true,
handleKeyPressed: true,
handleKeyReleased: true,
handleActionKeyPerformed: true,
handleActionPerformed: true,
size: 24,
sequence: 3,
isActiveLogics: true,
isMandatory: true
}
},
// M_Product_ID
{
columnName: 'M_Product_ID',
// elementColumnName: 'M_Product_ID',
tableName: 'M_MatchInv',
isFromDictionary: true,
overwriteDefinition: {
handleKeyPressed: true,
handleKeyReleased: true,
handleActionKeyPerformed: true,
handleActionPerformed: true,
size: 24,
sequence: 4
}
},
// Date From
{
elementColumnName: 'Date_From',
isFromDictionary: true,
overwriteDefinition: {
handleFocusGained: true,
handleFocusLost: true,
handleKeyPressed: true,
handleKeyReleased: true,
handleActionKeyPerformed: true,
handleActionPerformed: true,
size: 24,
name: 'Fecha Desde',
componentPath: 'FieldDate',
sequence: 6,
isActiveLogics: true,
isMandatory: true
}
},
// Date To
{
elementColumnName: 'Date_To',
isFromDictionary: true,
overwriteDefinition: {
handleFocusGained: true,
handleFocusLost: true,
handleKeyPressed: true,
handleKeyReleased: true,
handleActionKeyPerformed: true,
handleActionPerformed: true,
size: 24,
name: 'Fecha Hasta',
sequence: 7,
componentPath: 'FieldDate',
isActiveLogics: true,
isMandatory: true
}
},
// Assign From
{
elementColumnName: 'Assign_From',
isFromDictionary: true,
overwriteDefinition: {
size: 24,
sequence: 0,
name: 'Asignar Desde',
handleActionPerformed: true,
handleContentSelection: true,
handleActionKeyPerformed: true,
componentPath: 'FieldSelect'
}
},
// Assign To
{
elementColumnName: 'Assign_To',
isFromDictionary: true,
overwriteDefinition: {
size: 24,
sequence: 1,
name: 'Asignar Hasta',
handleActionPerformed: true,
handleContentSelection: true,
handleActionKeyPerformed: true,
componentPath: 'FieldSelect'
}
},
// Search Mode
{
elementColumnName: 'Search_Mode',
isFromDictionary: true,
overwriteDefinition: {
size: 24,
sequence: 2,
name: 'Modo de Búsqueda',
handleActionKeyPerformed: true,
handleActionPerformed: true,
isActiveLogics: true,
componentPath: 'FieldSelect',
isMandatory: true
}
}
]

View File

@ -0,0 +1,216 @@
<!--
ADempiere-Vue (Frontend) for ADempiere ERP & CRM Smart Business Solution
Copyright (C) 2017-Present E.R.P. Consultores y Asociados, C.A.
Contributor(s): Elsio Sanchez esanchez@erpya.com www.erpya.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https:www.gnu.org/licenses/>.
-->
<template>
<el-container style="height: 100% !important;">
<el-header>
<el-steps :active="active" finish-status="success" process-status="finish">
<el-step
v-for="(item, index) in step"
:key="index"
:title="item.name"
/>
</el-steps>
</el-header>
<carousel
:step-reference="metadata.fileName"
:steps="step"
:indicator="active"
style="display: contents;height: -webkit-fill-available;"
>
<search-criteria
v-if="active === 0"
:metadata="fieldsList"
/>
<invoices
v-if="active === 1"
/>
<receipt
v-if="active === 2"
/>
</carousel>
<div :class="styleFooter">
<el-button type="primary" :icon="iconStep" style="float: right;" @click="next" />
<el-button v-show="active > 0" type="danger" icon="el-icon-close" style="float: right;margin-right: 10px;" @click="prev" />
</div>
</el-container>
</template>
<script>
import Carousel from '@/components/ADempiere/Carousel'
import formMixin from '@/components/ADempiere/Form/formMixin.js'
import fieldsList from './fieldList.js'
import SearchCriteria from './components/SearchCriteria/index'
import Invoices from './components/Invoices/index'
import Receipt from './components/Receipt/index'
export default {
name: 'VMatch',
components: {
Carousel,
SearchCriteria,
Invoices,
Receipt
},
mixins: [
formMixin
],
props: {
metadata: {
type: Object,
default: () => {
return {
uuid: 'V-Match',
containerUuid: 'V-Match',
fieldsList
}
}
}
},
data() {
return {
fieldsList,
active: 0
}
},
computed: {
styleFooter() {
const showTitle = this.$store.getters.getIsShowTitleForm
if (showTitle) {
return 'show-title-footer'
}
return 'from-footer'
},
step() {
return [
{
name: this.$t('views.searchCriteria'),
description: this.$t('form.match.description.searchCriteria')
},
{
name: this.$t('form.match.title.invoice'),
description: this.$t('form.match.description.invoice')
},
{
name: this.$t('form.match.title.deliveryReceipt'),
description: this.$t('form.match.description.deliveryReceipt')
}
]
},
businessPartnerUuid() {
return this.$store.getters.getValueOfField({
containerUuid: this.$route.meta.uuid,
columnName: 'C_BPartner_ID_UUID'
})
},
selectedInvoice() {
return this.$store.getters.getSelectedInvoceMatch
},
selectedReceipts() {
return this.$store.getters.getSelectedReceiptsMatch
},
iconStep() {
const step = this.step.length - 1
if (step === this.active) {
return 'el-icon-s-tools'
}
return 'el-icon-check'
}
},
watch: {
businessPartnerUuid(value) {
if (!this.isEmptyValue(value)) {
this.$store.dispatch('serverInvocesList', {
businessPartnerUuid: value,
formUuid: this.$route.meta.uuid
})
this.$store.dispatch('serverReceiptsList', {
businessPartnerUuid: value,
formUuid: this.$route.meta.uuid
})
}
}
},
methods: {
next() {
if (this.iconStep !== 'el-icon-s-tools') {
this.active++
} else {
this.sendAssignment(this.businessPartnerUuid)
}
},
prev() {
this.active--
},
sendAssignment(businessPartnerUuid) {
this.$store.dispatch('processAssignment', {
businessPartnerUuid,
receiptUuid: this.selectedReceipts,
invoceUuid: this.selectedInvoice,
formUuid: this.$route.meta.uuid
})
}
}
}
</script>
<style lang="scss" scoped>
.from-main {
padding-right: 1% !important;
padding-bottom: 0px !important;
padding-top: 0px !important;
padding-left: 1% !important;
height: 90%;
}
.card-form {
height: 100% !important;
overflow: auto;
}
.header {
padding-bottom: 0px;
box-sizing: border-box;
flex-shrink: 0;
height: 4% !important;
padding-left: 1%;
padding-right: 1%;
}
.from-footer {
height: 5% !important;
box-sizing: border-box;
flex-shrink: 0;
}
.show-title-footer {
height: 15% !important;
box-sizing: border-box;
flex-shrink: 0
}
.main {
height: 90%;
display: block;
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
-ms-flex-preferred-size: auto;
flex-basis: auto;
overflow: auto;
-webkit-box-sizing: border-box;
box-sizing: border-box;
padding-top: 0px;
padding-right: 20px;
padding-bottom: 20px;
padding-left: 20px;
}
</style>

View File

@ -0,0 +1,63 @@
// ADempiere-Vue (Frontend) for ADempiere ERP & CRM Smart Business Solution
// Copyright (C) 2017-Present E.R.P. Consultores y Asociados, C.A.
// Contributor(s): Elsio Sanchez elsiosanches@gmail.com www.erpya.com
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// List of fields to send in search
import language from '@/lang'
export default [
{
columnName: 'nrDocument',
label: language.t('form.match.table.nrDocument'),
isNumeric: false,
size: '150'
},
{
columnName: 'date',
label: language.t('table.recentItems.date'),
isNumeric: false,
size: '150'
},
{
columnName: 'C_BPartner_ID',
label: language.t('form.pos.order.BusinessPartnerCreate.businessPartner'),
isNumeric: false,
size: '200'
},
{
columnName: 'noLínea',
label: language.t('form.pos.order.numberLines'),
isNumeric: true,
size: '150'
},
{
columnName: 'product',
label: language.t('form.pos.tableProduct.product'),
isNumeric: true,
size: '150'
},
{
columnName: 'quantity',
label: language.t('form.pos.tableProduct.quantity'),
isNumeric: true,
size: '150'
},
{
columnName: 'assigned',
label: language.t('form.match.field.assigning'),
isNumeric: true,
size: '150'
}
]

View File

@ -57,6 +57,9 @@ export default {
case 'WFActivity':
form = import('@/components/ADempiere/Form/WorkflowActivity')
break
case 'VMatch':
form = import('@/components/ADempiere/Form/VMatch')
break
case 'VPOS':
form = import('@/components/ADempiere/Form/VPOS')
break

View File

@ -587,6 +587,30 @@ export default {
title: 'Change Log',
description: 'Workflow timeline'
}
},
match: {
title: {
invoice: 'Invoice',
deliveryReceipt: 'Delivery / Receipt'
},
description: {
searchCriteria: 'Select a Business Partner to check the pending documents to be assigned',
invoice: 'Select an Invoice to assign the corresponding Delivery/Receipt to',
deliveryReceipt: 'Select at least one Delivery/Receipt to which you require to assign the selected invoice'
},
field: {
toAssigned: 'To be Assigned',
assigning: 'Assigning',
difference: 'Difference'
},
filtersSearch: {
sameBusinessPartner: 'Same Business Partner',
sameProduct: 'Same Product ',
sameQuantity: 'SameQuantity '
},
table: {
nrDocument: 'Nr Document'
}
}
}
}

View File

@ -435,7 +435,7 @@ export default {
tax: 'Impuesto',
total: 'Total',
itemQuantity: 'Cantidad de Árticulo',
numberLines: 'Cantidad de Lineas',
numberLines: 'Numero de Lineas',
pointSale: 'Punto de Venta',
collect: 'Cobrar',
collections: 'Cobros',
@ -569,6 +569,30 @@ export default {
description: 'Linea de tiempo del flujo de trabajo'
}
}
},
match: {
title: {
invoice: 'Factura',
deliveryReceipt: 'Entrega / Recibo'
},
description: {
searchCriteria: 'Seleccione un Socio de Negocio para verificar los documentos pendientes por asignar',
invoice: 'Seleccione una Factura para asignar las Entrega/Recibo correspondiente',
deliveryReceipt: 'Seleccione al menos una Entrega/Recibo a la cual requiere asignar la factura seleccionada'
},
field: {
toAssigned: 'Para ser Asignadas',
assigning: 'Asignando',
difference: 'Diferencia'
},
filtersSearch: {
sameBusinessPartner: 'Mismo Socio del Negocio',
sameProduct: 'Mismo Producto ',
sameQuantity: 'Misma Cantidad '
},
table: {
nrDocument: 'Nr Docuemnto'
}
}
}
}

View File

@ -0,0 +1,122 @@
import {
receipts,
invoces,
processReceipt
} from '@/api/ADempiere/form/match.js'
import { showMessage } from '@/utils/ADempiere/notification.js'
const match = {
invoices: [],
receipts: [],
selectedReceipt: [],
selectedInvoce: []
}
export default {
state: match,
mutations: {
setInvoiceLisMatch(state, list) {
state.invoices = list
},
setReceiptsListMatch(state, list) {
state.receipts = list
},
setSelectedReceiptMatch(state, select) {
state.selectedReceipt = select
},
setSelectedInvoceMatch(state, select) {
state.selectedInvoce = select
}
},
actions: {
serverReceiptsList({ commit }, {
businessPartnerUuid,
formUuid
}) {
receipts({
businessPartnerUuid,
formUuid
})
.then(response => {
commit('setReceiptsListMatch', response)
})
.catch(error => {
console.warn(`serverReceiptsList: ${error.message}. Code: ${error.code}.`)
showMessage({
type: 'error',
message: error.message,
showClose: true
})
})
},
serverInvocesList({ commit }, {
businessPartnerUuid,
formUuid
}) {
invoces({
businessPartnerUuid,
formUuid
})
.then(response => {
commit('setInvoiceLisMatch', response)
})
.catch(error => {
console.warn(`serverInvocesList: ${error.message}. Code: ${error.code}.`)
showMessage({
type: 'error',
message: error.message,
showClose: true
})
})
},
processAssignment({ commit }, {
businessPartnerUuid,
receiptUuid,
invoceUuid,
formUuid
}) {
processReceipt({
businessPartnerUuid,
receiptUuid,
invoceUuid,
formUuid
})
.then(response => {
showMessage({
type: 'success',
message: response.message,
showClose: true
})
})
.catch(error => {
console.warn(`processAssignment: ${error.message}. Code: ${error.code}.`)
showMessage({
type: 'error',
message: error.message,
showClose: true
})
})
},
selectedelectedReceiptsMatch({ commit }, select) {
commit('setSelectedReceiptMatch', select)
},
selectedInvoceMatch({ commit }, select) {
console.log({ select })
commit('setSelectedInvoceMatch', select)
}
},
getters: {
getInvoiceMatch: (state) => {
return state.invoices
},
getReceiptsMatch: (state) => {
return state.receipts
},
getSelectedReceiptsMatch: (state) => {
return state.selectedReceipt
},
getSelectedInvoceMatch: (state) => {
return state.selectedInvoce
}
}
}