Learn practical skills, build real-world projects, and advance your career
mapping={'testata':{
'VHY59FEMVS':'X',
'VHUKID':'ID chiave unica',
'VHY59FECN':'Control Number',
'VHY59FEMVS':'Match Voucher Status',
'VHY59FERF':'Responsabile Fornitore',
'VHY59PA701':'Tipo Documento',
'VHY59FE008':'Denominazione Cedente',
'VHY59FE009':'Id Codice Cedente',
'VHY59FE010':'Codice Fiscale Cedente',
'VHEDTY':'Tipo Record',
'VHEDSQ':'Seq. record',
'VHEKCO':'Soc Cod',
'VHEDOC':'N° doc.',
'VHEDCT':'Tp Dc',
'VHEDLN':'N° riga',
'VHEDST':'Gruppo trans.',
'VHEDFT':'Formato traduzione',
'VHEDDT':'Data trasmis.',
'VHEDER':'Ind T/R',
'VHEDDL':'N° righe',
'VHEDSP':'E R',
'VHEDBT':'N° batch',
'VHPNID':'Partner commerc.',
'VHCO':'Soc ',
'VHKCOO':'Soc. Ord.',
'VHDOCO':'N° ordine',
'VHDCTO':'Tp Or',
'VHSFXO':'Suf Ord',
'VHKCO':'Soc Doc',
'VHDOC':'Numero documento',
'VHDCTV':'Tp Dc',
'VHAN8':'Numero Indirizzo',
'VHVINV':'Numero fattura',
'VHDGJ':'Data CoGe',
'VHDIVJ':'Data fattura',
'VHSHAN':'Cd dest ',
'VHPA8':'Codice Princip.',
'VHAN8J':'Ind/zzo cess.',
'VHSNTO':'Resp. Appr.',
'VHCRRM':'Valuta ',
'VHCRCD':'Cod val',
'VHCRR':'Tasso cambio',
'VHEXR1':'Tp IV',
'VHTXA1':'Codice IVA',
'VHPCR':'% cauz.',
'VHPTC':'Term. Pagam',
'VHPYIN':'Met. Pag.',
'VHPTD':'Descrizione ',
'VHPEFJ':'Val. Prz.',
'VHASN':'Prog. Rett.',
'VHATXT':'Testo associato',
'VHAVCH':'C V',
'VHCRMD':'M T',
'VHCORD':'O M ',
'VHDCP':'% Scon',
'VHDCD':'Gg scon',
'VHNDTP':'Gg. Net.',
'VHDDU':'Scad . . . . . . . . . . . . . . . .',
'VHDDJ':'Data Scad.',
'VHRMK':'Causale ',
'VHVRMK':'Nota ',
'VHVR01':'Riferimento ',
'VHVR02':'Riferimento 2',
'VHURCD':'Cod. utente',
'VHURDT':'Data utente',
'VHURAT':'Imp. utente',
'VHURAB':'Numero utente',
'VHURRF':'Riferim. utente',
'VHTORG':'Originatore transazione',
'VHUSER':'ID Utente',
'VHPID':'ID Programma',
'VHJOBN':'ID staz. Lavoro',
'VHUPMJ':'Data Agg.',
'VHTDAY':'Ora ',
'VHGAN8':'Global Location Number',
'VHGSHAN':'Ship To GLN',
'VHGPA8':'Parent Address GLN',
'VHGAN8J':'Alternate Payee GLN',
'VHMCU':'Centro Controllo',
'VHY59FE004':'Match Type ',
'VHY59FE005':'Responsabile Fornitore',
'VHY59FECR':'Motivo Chiusura',
'VHY59FEPTS':'Protocollo SDI ',
'VHY59FEIDI':'ID Intermediario ',
'VHY59FEDRF':'Data Ricezione Fattura',
'VHY59FENT':'Nota Interna'
},


'dettaglio' : {
'SZUKID':'ID chiave unica',
'SZY59FELND':'FE Line Number',
'SZY59FECN':'Control Number',
'SZY59FEVLS':'Voucher Line Status',
'SZY59FEPA':'Proposal Action',
'SZY59FEAC':'Action Code',
'SZY59FEMR':'Match Rule ',
'SZY59FERF':'Responsabile Fornitore',
'SZY59PA727':'Id Documento Ord. Acquisto',
'SZY59PA728':'Data Documento Ord. Acquisto',
'SZY59PA729':'Numero Item Ord. Acquisto',
'SZY59PA731':'Codice CUP Ord. Acquisto',
'SZY59PA732':'Codice CIG Ord. Acquisto',
'SZY59PA802':'Tipo Cessione Prestazione',
'SZY59PA763':'Data DDT',
'SZEDTY':'Tipo Record',
'SZEDSQ':'Seq. record',
'SZEKCO':'Soc Cod',
'SZEDOC':'N° doc.',
'SZEDCT':'Tp Dc',
'SZEDLN':'N° riga',
'SZEDST':'Gruppo trans.',
'SZEDFT':'Formato traduzione',
'SZEDDT':'Data trasmis.',
'SZEDER':'Ind T/R',
'SZEDDL':'N° righe',
'SZEDSP':'E R',
'SZEDBT':'N° batch',
'SZPNID':'Partner commerc.',
'SZACIN':'I A',
'SZCO':'Soc ',
'SZKCOO':'Soc. Ord.',
'SZDOCO':'N° ordine',
'SZDCTO':'Tp Or',
'SZSFXO':'Suf Ord',
'SZLNID':'N° riga',
'SZLNTY':'Tp Rg',
'SZKCO':'Soc Doc',
'SZDOC':'Numero documento',
'SZDCTV':'Tp Dc',
'SZAN8':'Numero Indirizzo',
'SZVINV':'Numero fattura',
'SZITM':'Cod. art. Breve',
'SZLITM':'2° codice articolo',
'SZAITM':'3° codice articolo',
'SZCITM':'N° art. CL/FO',
'SZMCU':'Centro Controllo',
'SZLOCN':'Ubicazione ',
'SZLOTN':'Numero serie lotto',
'SZDMCT':'Numero Contratto',
'SZDMCS':'N. Sup',
'SZPEFJ':'Val. Prz.',
'SZFRGD':'Qlt da',
'SZTHGD':'A ',
'SZFRMP':'Da tit. ',
'SZTHRP':'Titolo \'a\'',
'SZASN':'Prog. Rett.',
'SZCATN':'Catalogo ',
'SZPL':'ID ',
'SZELEV':'Elv ',
'SZAVCH':'C V',
'SZCORD':'O M ',
'SZAID':'ID Conto',
'SZANI':'Codice conto ',
'SZDSC1':'Descrizione ',
'SZDSC2':'Descrizione Riga 2',
'SZPST':'Stato Pag.',
'SZGLBA':'Conto CoGe',
'SZCRC':'Cod trt',
'SZSBL':'Subledger ',
'SZSBLT':'Tipo Subledger',
'SZUOPN':'Quantità aperta',
'SZUOM':'UM ',
'SZUPRC':'Prezzo unitario',
'SZAEXP':'Prezzo Totale',
'SZAG':'Importo lordo',
'SZAAP':'Importo aperto',
'SZADSC':'Sconto Potenziale',
'SZADSA':'Sconto Applicato',
'SZATXA':'Importo imponibile',
'SZATXN':'Importo non imponibile',
'SZSTAM':'Imp ',
'SZCRRM':'Valuta ',
'SZCRCD':'Cod val',
'SZCRR':'Tasso cambio',
'SZFRRC':'Costo un. in valuta',
'SZFEA':'Prezzo totale in valuta estera',
'SZACR':'Importo valuta',
'SZFAP':'Importo aperto_val',
'SZCDS':'Sconto pot. val. estera',
'SZCDSA':'Sconto applicato in valuta',
'SZCTAM':'Imposta val.est.',
'SZCTXN':'Foreign Non-Taxable',
'SZCTXA':'Imponibile val. estera',
'SZTX':'Imp Y/N',
'SZEXR1':'Tp IV',
'SZTXA1':'Codice IVA',
'SZPTC':'Term. Pagam',
'SZPTD':'Descrizione ',
'SZDCP':'% Scon',
'SZDCD':'Gg scon',
'SZNDTP':'Gg. Net.',
'SZDDJ':'Data Scad.',
'SZRMK':'Causale ',
'SZVRMK':'Nota ',
'SZVR01':'Riferimento ',
'SZVR02':'Riferimento 2',
'SZURCD':'Cod. utente',
'SZURDT':'Data utente',
'SZURAT':'Imp. utente',
'SZURAB':'Numero utente',
'SZURRF':'Riferim. utente',
'SZTORG':'Originatore transazione',
'SZUSER':'ID Utente',
'SZPID':'ID Programma',
'SZJOBN':'ID staz. Lavoro',
'SZUPMJ':'Data Agg.',
'SZTDAY':'Ora ',
'SZNLIN':'N. Righe',
'SZJBCD':'Qual. prof',
'SZSRQTY':'Service Quantity',
'SZSRUOM':'Service UoM',
'SZNBRU':'Non-Billable Retainage',
'SZNEWR':'Expense At Voucher',
'SZGAN8':'Global Location Number',
'SZY59PA803':'Codice Tipo Articolo',
'SZY59FE004':'Match Type ',
'SZY59FE005':'Responsabile Fornitore',
'SZY59PA805':'Descrizione Dettaglio',
'SZY59PAD01':'Descrizione Dettaglio'
},

'ricevimenti' : {
'PRMATC':'T A',
'PRAN8':'Numero Indirizzo',
'PRKCOO':'Soc. Ord.',
'PRDOCO':'N° ordine',
'PRDCTO':'Tp Or',
'PRSFXO':'Suf Ord',
'PRLNID':'N° riga',
'PRNLIN':'N. Righe',
'PRALIN':'Riga ass.',
'PRRTBY':'Reg. da',
'PRDMCT':'Numero Contratto',
'PRDMCS':'N. Sup',
'PRBALU':'S ',
'PRITM':'Cod. art. Breve',
'PRLITM':'2° codice articolo',
'PRAITM':'3° codice articolo',
'PRIMCU':'Centro costo',
'PRLOCN':'Ubicazione ',
'PRLOTN':'Numero serie lotto',
'PRLOTG':'Qal ',
'PRLOTP':'Titolo lotto ',
'PRVRMK':'Nota ',
'PRCNID':'Rif. Spediz.',
'PRNXTR':'Pross Stato',
'PRLTTR':'St. Cr.',
'PRTRDJ':'Data Ordine',
'PRRCDJ':'Data ricev.',
'PRDRQJ':'Data rich.',
'PRPDDJ':'Prel Pian',
'PROPDJ':'Promessa originale',
'PRRCD':'Codice Causale',
'PRVINV':'Numero fattura',
'PRPTC':'Term. Pagam',
'PRPST':'Stato Pag.',
'PRLAND':'C F',
'PRPRP5':'Reg. costo',
'PRLVLA':'Costo liv.',
'PRILOG':'R F',
'PRDLOG':'R F',
'PRRTGC':'Prc Ric',
'PRRCPF':'r C',
'PRAVCH':'C V',
'PRLNTY':'Tp Rg',
'PRGLC':'Classe CoGe',
'PRMCU':'Centro Controllo',
'PRCO':'Soc ',
'PRAID':'ID Conto',
'PRANI':'Codice conto ',
'PROMCU':'Centro costo',
'PROBJ':'Mst. Ct.',
'PRSUB':'Sottoct. ',
'PRASID':'N° di serie',
'PRSBL':'Subledger ',
'PRSBLT':'Tipo Subledger',
'PRKCO':'Soc Doc',
'PRDOC':'Numero documento',
'PRDCT':'Tp Dc',
'PRSFX':'Rat Pag',
'PRDGL':'Data CoGe',
'PRJELN':'Riga P/N',
'PRVANI':'Conto Ricev. non fatt.',
'PRTX':'Imp Y/N',
'PREXR1':'Tp IV',
'PRTXA1':'Codice IVA',
'PRUOM':'UM ',
'PRUORG':'Quantità ordinata',
'PRUPTD':'Quantità pagata fino a',
'PRUOPN':'Quantità aperta',
'PRUREC':'Quantità ricevuta',
'PRUCLO':'Quantità chiusa',
'PRQTYS':'Quantità stoccata',
'PRQTYR':'Quantità resa',
'PRQTYW':'Quantità rilavorata',
'PRQTYC':'Quantità scartata',
'PRQTYJ':'Quantità respinta',
'PRQTYA':'Quantità rettif.',
'PRUOM3':'UM PR',
'PRPRRC':'Costo unit.',
'PRECST':'Costo totale',
'PRAPTD':'Importo pagato fino a',
'PRAOPN':'Importo aperto ',
'PRAREC':'Importo ricevuto',
'PRACLO':'Importo chiuso',
'PRAVCO':'Differenza costo',
'PRVARC':'Varianza costo',
'PRCRCD':'Cod val',
'PRCRR':'Tasso cambio',
'PRFRRC':'Costo un. in valuta',
'PRFEC':'Costo totale in valuta estera',
'PRFAP':'Importo aperto',
'PRFAPT':'Importo pagato finora',
'PRFREC':'Importo ricevuto in valuta',
'PRFCLO':'Importo chiuso',
'PRURCD':'Cod. utente',
'PRURDT':'Data utente',
'PRURAT':'Imp. utente',
'PRURAB':'Numero utente',
'PRURRF':'Riferim. utente',
'PRTORG':'Originatore transazione',
'PRUSER':'ID Utente',
'PRPID':'ID Programma',
'PRJOBN':'ID staz. Lavoro',
'PRTERM':'Identific. terminale',
'PRUPMJ':'Data Agg.',
'PRTDAY':'Ora ',
'PRBCRC':'Val. Bse',
'PRSTAM':'Imp ',
'PRCTAM':'Imposta val.est.',
'PRMACT':'Cti mul.',
'PRPLT':'Tara SSCC ',
'PRPAK':'SSCC Imb.',
'PRSCCN':'SCC ',
'PRSCCQ':'Quantità SCC',
'PRSCUM':'UM SC',
'PRUPCN':'UPC ',
'PRUPQT':'Quantità UPC',
'PRUPUM':'UM UP',
'PRSHPN':'Codice consegna',
'PRVR01':'Riferimento ',
'PRVR02':'Riferimento 2',
'PRFUF3':'Uso futuro ',
'PRFUF4':'Uso futuro ',
'PRFUF5':'Uso futuro ',
'PRFUF6':'Uso futuro ',
'PRMERL':'Rev Prd',
'PRKTLN':'N°riga kit',
'PRCPNT':'N° riga',
'PRVR04':'Riferimento Esterno 1',
'PRVR05':'Riferimento Esterno 2',
'PRUKID':'ID chiave unica',
'PRUOM2':'UM secondaria',
'PRDUAL':'UM Doppia',
'PRSQOR':'Q/tà ordinata secondaria',
'PRXDCK':'Mov. tra Piatt.',
'PRPOE':'Entrata Uscita',
'PRVR03':'Riferimento ',
'PRLDNM':'Carica Numero',
'PRCTSN':'N. serie Contenitore',
'PRPROV':'Cd.p/zo sostit.',
'PRASN':'Prog. Rett.',
'PRPRFLG1':'Controllo 01 Calc. prz',
'PRPRFLG2':'Controllo 02 Calc. prz',
'PRMOADJ':'S M',
'PRPS09':'S ',
'PRQTYPY':'Quantità Da pagare',
'PRWVID':'ID Recip.',
'PRCNTRTID':'ID Contratto',
'PRCNTRTDID':'ID dett. Contratto',
'PRREVFLG':'Rivisto ',
'PRAPPFLG':'Approv. ',
'PRREVAN8':'N. indirizzo Revisore',
'PRAPPAN8':'N. indirizzo Resp. approv.',
'PRWOPID':'ID Op.',
'PRWVTY':'Classe Recip.',
'PRJBCD':'Qual. prof',
'PRSRQTY':'Service Quantity',
'PRSRUOM':'Service UoM',
'PRNBRU':'Non-Billable Retainage',
'PRNEWR':'Expense At Voucher',
'PRSRRC':'Sec. Unit Cost',
'PRFSRRC':'Foreign Sec. Unit Cost',
'PRPMPN':'Production Number',
'PRPNS':'Production Number Short'
}
         }
import datetime

def date_from_julian(jdate):
    if ~isinstance(jdate, str):
        jdate = str(jdate)
    date = datetime.datetime.strptime(jdate.replace('.0','')[1:], '%y%j').date()
    return date.strftime('%d/%m/%y')
    
def extract_nnn(struttura,numero_fattura):
    try:
        struttura=struttura.lower().replace('-','/').replace(' ','/')
        numero_fattura=numero_fattura.replace('-','/').replace(' ','/')
        for token in struttura.split('/'):
            if token=='nnn':
                return numero_fattura.split('/')[struttura.split('/').index(token)].strip()
    except:
        return 'ERROR!!!!!'
    
def match_numero(num1,num2, modalita):
    num1=str(num1).strip()
    num2=str(num2).strip()
    if num1.zfill(max(len(num1),len(num2)))==num2.zfill(max(len(num1),len(num2))):
        return True
    elif modalita=='FINISCE CON':
        return num1[-min(len(num1),len(num2)):]==num2[-min(len(num1),len(num2)):]
    else:
        return False
    
    
def custom_match(modalita,num_test,num_ric, struttura):
    modalita=str(modalita).upper()
    if modalita=='COINCIDE':
        return match_numero(num1,num2,modalita)
    elif modalita=='FINISCE CON':
        return num_test.strip().endswith(num_ric.strip())
    elif modalita=='FINISCE CON POI/':
        
        return num_test.strip().split("/",1)[0].endswith(num_ric.strip())
    elif modalita=='INIZIA POI/':
        return num_test.strip().split("/",1)[1].startswith(num_ric.strip())
    elif (modalita=='INIZIA CON SENZA 0') or (modalita=='INIZIA CON' and struttura.startswith('00nnn')):
        return num_test.strip().lstrip('0').startswith(num_ric.strip().lstrip('0'))
    elif modalita=='INIZIA CON':
        return num_test.strip().startswith(num_ric.strip())
    elif modalita=='INIZIA POI E':
        return num_test.strip().split("E",1)[0].startswith(num_ric.strip())
    elif modalita=='E\' INTERNO A':
        return num_test.strip().contains(num_ric.strip())