[open-ils-commits] r12701 - trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq (erickson)

svn at svn.open-ils.org svn at svn.open-ils.org
Fri Mar 27 10:33:18 EDT 2009


Author: erickson
Date: 2009-03-27 10:33:16 -0400 (Fri, 27 Mar 2009)
New Revision: 12701

Modified:
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Financials.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Lineitem.pm
Log:
using new common cat code to in-transactoin bib/volume/copy creation.  created streamlined PO creation method that creates po, assets, and debits in one transaction.  moved asset create logic into financials.pm for consistency

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Financials.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Financials.pm	2009-03-27 02:26:33 UTC (rev 12700)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Financials.pm	2009-03-27 14:33:16 UTC (rev 12701)
@@ -9,6 +9,7 @@
 use OpenSRF::Utils::SettingsClient;
 use OpenILS::Event;
 use OpenILS::Application::AppUtils;
+use OpenILS::Application::Acq::Lineitem;
 my $U = 'OpenILS::Application::AppUtils';
 
 # ----------------------------------------------------------------------------
@@ -543,17 +544,213 @@
 );
 
 sub create_purchase_order {
-    my($self, $conn, $auth, $p_order) = @_;
+    my($self, $conn, $auth, $po, $args) = @_;
+    $args ||= {};
+
     my $e = new_editor(xact=>1, authtoken=>$auth);
     return $e->die_event unless $e->checkauth;
-    $p_order->ordering_agency($e->requestor->ws_ou);
-    my $evt = create_purchase_order_impl($e, $p_order);
+    return $e->die_event unless $e->allowed('CREATE_PURCHASE_ORDER', $po->ordering_agency);
+
+    # create the PO
+    $po->ordering_agency($e->requestor->ws_ou);
+    my $evt = create_purchase_order_impl($e, $po);
     return $evt if $evt;
+
+    my $progress = 0;
+    my $total_debits = 0;
+    my $total_copies = 0;
+
+    my $respond = sub {
+        $conn->respond({
+            @_,
+            progress => ++$progress, 
+            total_debits => $total_debits,
+            total_copies => $total_copies,
+        });
+    };
+
+    if($$args{lineitems}) {
+
+        for my $li_id (@{$$args{lineitems}}) {
+
+            my $li = $e->retrieve_acq_lineitem([
+                $li_id,
+                {flesh => 1, flesh_fields => {jub => ['attributes']}}
+            ]) or return $e->die_event;
+
+            # point the lineitems at the new PO
+            $li->purchase_order($po->id);
+            $li->editor($e->requestor->id);
+            $li->edit_time('now');
+            $e->update_acq_lineitem($li) or return $e->die_event;
+        
+            # create the bibs/volumes/copies in the Evergreen database
+            if($$args{create_assets}) {
+                # args = {circ_modifier => code}
+                my ($count, $evt) = create_lineitem_assets_impl($e, $li_id, $args);
+                return $evt if $evt;
+                $total_copies+= $count;
+                $respond->(action => 'create_assets');
+            }
+
+            # create the debits
+            if($$args{create_debits}) {
+                # args = {encumberance => true}
+                my ($total, $evt) = create_li_debit_impl($e, $li, $args);
+                return $evt if $evt;
+                $total_debits += $total;
+                $respond->(action => 'create_debit');
+            }
+        }
+    }
+
     $e->commit;
-    return $p_order->id;
+    $respond->(complete => 1, purchase_order => $po->id);
+    return undef;
 }
 
 
+__PACKAGE__->register_method(
+	method => 'create_po_assets',
+	api_name	=> 'open-ils.acq.purchase_order.assets.create',
+	signature => {
+        desc => q/Creates assets for each lineitem in the purchase order/,
+        params => [
+            {desc => 'Authentication token', type => 'string'},
+            {desc => 'The purchase order id', type => 'number'},
+            {desc => q/Options hash./}
+        ],
+        return => {desc => 'Streams a total versus completed counts object, event on error'}
+    }
+);
+
+sub create_po_assets {
+    my($self, $conn, $auth, $po_id, $options) = @_;
+    my $e = new_editor(authtoken=>$auth, xact=>1);
+    return $e->die_event unless $e->checkauth;
+
+    my $po = $e->retrieve_acq_purchase_order($po_id) or return $e->event;
+    return $e->die_event unless 
+        $e->allowed('CREATE_PURCHASE_ORDER', $po->ordering_agency);
+
+    my $li_ids = $e->search_acq_lineitem({purchase_order=>$po_id},{idlist=>1});
+    my $total = @$li_ids;
+    my $count = 0;
+
+    for my $li_id (@$li_ids) {
+        my ($num, $evt) = create_lineitem_assets_impl($e, $li_id);
+        return $evt if $evt;
+        $conn->respond({total=>$count, progress=>++$count});
+    }
+
+    $po->edit_time('now');
+    $e->update_acq_purchase_order($po) or return $e->die_event;
+    $e->commit;
+
+    return {complete=>1};
+}
+
+__PACKAGE__->register_method(
+	method => 'create_lineitem_assets',
+	api_name	=> 'open-ils.acq.lineitem.assets.create',
+	signature => {
+        desc => q/Creates the bibliographic data, volume, and copies associated with a lineitem./,
+        params => [
+            {desc => 'Authentication token', type => 'string'},
+            {desc => 'The lineitem id', type => 'number'},
+            {desc => q/Options hash./}
+        ],
+        return => {desc => 'ID of newly created bib record, Event on error'}
+    }
+);
+
+sub create_lineitem_assets {
+    my($self, $conn, $auth, $li_id, $options) = @_;
+    my $e = new_editor(authtoken=>$auth, xact=>1);
+    return $e->die_event unless $e->checkauth;
+    my ($count, $resp) = create_lineitem_assets_impl($e, $li_id, $options);
+    return $resp if $resp;
+    $e->commit;
+    return $count;
+}
+
+sub create_lineitem_assets_impl {
+    my($e, $li_id, $options) = @_;
+    $options ||= {};
+    my $evt;
+
+    my $li = $e->retrieve_acq_lineitem([
+        $li_id,
+        {   flesh => 1,
+            flesh_fields => {jub => ['purchase_order', 'attributes']}
+        }
+    ]) or return (undef, $e->die_event);
+
+    # -----------------------------------------------------------------
+    # first, create the bib record if necessary
+    # -----------------------------------------------------------------
+    unless($li->eg_bib_id) {
+
+       my $record = OpenILS::Application::Cat::BibCommon->biblio_record_xml_import(
+            $e, $li->marc, undef, undef, undef, 1); #$rec->bib_source
+
+        if($U->event_code($record)) {
+            $e->rollback;
+            return (undef, $record);
+        }
+
+        $li->editor($e->requestor->id);
+        $li->edit_time('now');
+        $li->eg_bib_id($record->id);
+        $e->update_acq_lineitem($li) or return (undef, $e->die_event);
+    }
+
+    my $li_details = $e->search_acq_lineitem_detail({lineitem => $li_id}, {idlist=>1});
+
+    # -----------------------------------------------------------------
+    # for each lineitem_detail, create the volume if necessary, create 
+    # a copy, and link them all together.
+    # -----------------------------------------------------------------
+    my %volcache;
+    for my $li_detail_id (@{$li_details}) {
+
+        my $li_detail = $e->retrieve_acq_lineitem_detail($li_detail_id)
+            or return (undef, $e->die_event);
+
+        # Create the volume object if necessary
+        my $volume = $volcache{$li_detail->cn_label};
+        unless($volume and $volume->owning_lib == $li_detail->owning_lib) {
+            ($volume, $evt) =
+                OpenILS::Application::Cat::AssetCommon->find_or_create_volume(
+                    $e, $li_detail->cn_label, $li->eg_bib_id, $li_detail->owning_lib);
+            return (undef, $evt) if $evt;
+            $volcache{$volume->id} = $volume;
+        }
+
+        my $copy = Fieldmapper::asset::copy->new;
+        $copy->isnew(1);
+        $copy->loan_duration(2);
+        $copy->fine_level(2);
+        $copy->status(OILS_COPY_STATUS_ON_ORDER);
+        $copy->barcode($li_detail->barcode);
+        $copy->location($li_detail->location);
+        $copy->call_number($volume->id);
+        $copy->circ_lib($volume->owning_lib);
+        $copy->circ_modifier($$options{circ_modifier} || 'book');
+
+        $evt = OpenILS::Application::Cat::AssetCommon->create_copy($e, $volume, $copy);
+        return (undef, $evt) if $evt;
+ 
+        $li_detail->eg_copy_id($copy->id);
+        $e->update_acq_lineitem_detail($li_detail) or return (undef, $e->die_event);
+    }
+
+    return (scalar @{$li_details});
+}
+
+
+
+
 sub create_purchase_order_impl {
     my($e, $p_order) = @_;
 
@@ -625,9 +822,7 @@
     my $e = new_editor(xact=>1, authtoken=>$auth);
     return $e->die_event unless $e->checkauth;
     
-    my $total = 0;
     my $po = $e->retrieve_acq_purchase_order($po_id) or return $e->die_event;
-    # XXX which perms?
 
     my $li_ids = $e->search_acq_lineitem(
         {purchase_order => $po_id},
@@ -642,57 +837,69 @@
             }
         ]);
 
-        my ($price, $ptype) = get_li_price($li);
-        unless($price) {
-            $e->rollback;
-            return OpenILS::Event->new('ACQ_LINEITEM_NO_PRICE', payload => $li->id);
-        }
+        my ($total, $evt) = create_li_debit_impl($e, $li);
+        return $evt if $evt;
+    }
+    $e->commit;
+    return 1;
+}
 
-        unless($li->provider) {
-            $e->rollback;
-            return OpenILS::Event->new('ACQ_LINEITEM_NO_PROVIDER', payload => $li->id);
-        }
+sub create_li_debit_impl {
+    my($e, $li, $args) = @_;
+    $args ||= {};
 
-        my $lid_ids = $e->search_acq_lineitem_detail(
-            {lineitem => $li->id}, 
-            {idlist=>1}
-        );
+    my ($price, $ptype) = get_li_price($li);
 
-        for my $lid_id (@$lid_ids) {
-            my $lid = $e->retrieve_acq_lineitem_detail([
-                $lid_id,
-                {   flesh => 1, 
-                    flesh_fields => {acqlid => ['fund']}
-                }
-            ]);
+    unless($price) {
+        $e->rollback;
+        return (undef, OpenILS::Event->new('ACQ_LINEITEM_NO_PRICE', payload => $li->id));
+    }
 
-            my $debit = Fieldmapper::acq::fund_debit->new;
-            $debit->fund($lid->fund->id);
-            $debit->origin_amount($price);
+    unless($li->provider) {
+        $e->rollback;
+        return (undef, OpenILS::Event->new('ACQ_LINEITEM_NO_PROVIDER', payload => $li->id));
+    }
 
-            if($ptype == 2) { # price from vendor
-                $debit->origin_currency_type($li->provider->currency_type);
-                $debit->amount(currency_conversion_impl(
-                    $li->provider->currency_type, $lid->fund->currency_type, $price));
-            } else {
-                $debit->origin_currency_type($lid->fund->currency_type);
-                $debit->amount($price);
+    my $lid_ids = $e->search_acq_lineitem_detail(
+        {lineitem => $li->id}, 
+        {idlist=>1}
+    );
+
+    my $total = 0;
+    for my $lid_id (@$lid_ids) {
+
+        my $lid = $e->retrieve_acq_lineitem_detail([
+            $lid_id,
+            {   flesh => 1, 
+                flesh_fields => {acqlid => ['fund']}
             }
+        ]);
 
-            $debit->encumbrance($args->{encumbrance});
-            $debit->debit_type('purchase');
-            $e->create_acq_fund_debit($debit) or return $e->die_event;
+        my $debit = Fieldmapper::acq::fund_debit->new;
+        $debit->fund($lid->fund->id);
+        $debit->origin_amount($price);
 
-            # point the lineitem detail at the fund debit object
-            $lid->fund_debit($debit->id);
-            $lid->fund($lid->fund->id);
-            $e->update_acq_lineitem_detail($lid) or return $e->die_event;
-            $total += $debit->amount;
+        if($ptype == 2) { # price from vendor
+            $debit->origin_currency_type($li->provider->currency_type);
+            $debit->amount(currency_conversion_impl(
+                $li->provider->currency_type, $lid->fund->currency_type, $price));
+        } else {
+            $debit->origin_currency_type($lid->fund->currency_type);
+            $debit->amount($price);
         }
+
+        $debit->encumbrance($args->{encumbrance});
+        $debit->debit_type('purchase');
+        $e->create_acq_fund_debit($debit) or return (undef, $e->die_event);
+
+        # point the lineitem detail at the fund debit object
+        $lid->fund_debit($debit->id);
+        $lid->fund($lid->fund->id);
+        $e->update_acq_lineitem_detail($lid) or return (undef, $e->die_event);
+        $total += $debit->amount;
     }
 
-    $e->commit;
-    return $total;
+    return ($total);
 }
 
 

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Lineitem.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Lineitem.pm	2009-03-27 02:26:33 UTC (rev 12700)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Lineitem.pm	2009-03-27 14:33:16 UTC (rev 12701)
@@ -9,6 +9,8 @@
 use OpenILS::Const qw/:const/;
 use OpenSRF::Utils::SettingsClient;
 use OpenILS::Application::AppUtils;
+use OpenILS::Application::Cat::BibCommon;
+use OpenILS::Application::Cat::AssetCommon;
 my $U = 'OpenILS::Application::AppUtils';
 
 
@@ -60,167 +62,8 @@
     return $li->id;
 }
 
-__PACKAGE__->register_method(
-	method => 'create_po_assets',
-	api_name	=> 'open-ils.acq.purchase_order.assets.create',
-	signature => {
-        desc => q/Creates assets for each lineitem in the purchase order/,
-        params => [
-            {desc => 'Authentication token', type => 'string'},
-            {desc => 'The purchase order id', type => 'number'},
-            {desc => q/Options hash./}
-        ],
-        return => {desc => 'Streams a total versus completed counts object, event on error'}
-    }
-);
 
-sub create_po_assets {
-    my($self, $conn, $auth, $po_id, $options) = @_;
-    my $e = new_editor(authtoken=>$auth, xact=>1);
-    return $e->die_event unless $e->checkauth;
-
-    my $po = $e->retrieve_acq_purchase_order($po_id) or return $e->event;
-    return $e->die_event unless 
-        $e->allowed('CREATE_PURCHASE_ORDER', $po->ordering_agency);
-
-    my $li_ids = $e->search_acq_lineitem({purchase_order=>$po_id},{idlist=>1});
-    my $total = @$li_ids;
-    my $count = 0;
-
-    for my $li_id (@$li_ids) {
-        my $resp = create_lineitem_assets_impl($e, $auth, $li_id);
-        if($U->event_code($resp)) {
-            $e->rollback;
-            return $resp;
-        }
-        $conn->respond({total=>$count, progress=>++$count});
-    }
-
-    $po->edit_time('now');
-    $e->update_acq_purchase_order($po) or return $e->die_event;
-    $e->commit;
-
-    return {complete=>1};
-}
-
 __PACKAGE__->register_method(
-	method => 'create_lineitem_assets',
-	api_name	=> 'open-ils.acq.lineitem.assets.create',
-	signature => {
-        desc => q/Creates the bibliographic data, volume, and copies associated with a lineitem./,
-        params => [
-            {desc => 'Authentication token', type => 'string'},
-            {desc => 'The lineitem id', type => 'number'},
-            {desc => q/Options hash./}
-        ],
-        return => {desc => 'ID of newly created bib record, Event on error'}
-    }
-);
-
-sub create_lineitem_assets {
-    my($self, $conn, $auth, $li_id, $options) = @_;
-    my $e = new_editor(authtoken=>$auth, xact=>1);
-    return $e->die_event unless $e->checkauth;
-    my $resp = create_lineitem_assets_impl($e, $auth, $li_id, $options);
-    if($U->event_code($resp)) {
-        $e->rollback;
-        return $resp;
-    }
-    $e->commit;
-    return $resp;
-}
-
-sub create_lineitem_assets_impl {
-    my($e, $auth, $li_id, $options) = @_;
-    my $li = $e->retrieve_acq_lineitem([
-        $li_id,
-        {   flesh => 1,
-            flesh_fields => {jub => ['purchase_order']}
-        }
-    ]) or return $e->die_event;
-
-    return OpenILS::Event->new('BAD_PARAMS') # make this perm-based, not owner-based
-        unless $li->purchase_order->owner == $e->requestor->id;
-
-    # -----------------------------------------------------------------
-    # first, create the bib record if necessary
-    # -----------------------------------------------------------------
-    unless($li->eg_bib_id) {
-        my $record = $U->simplereq(
-            'open-ils.cat', 
-            'open-ils.cat.biblio.record.xml.import',
-            $auth, $li->marc, $li->source_label);
-
-        if($U->event_code($record)) {
-            $e->rollback;
-            return $record;
-        }
-
-        $li->editor($e->requestor->id);
-        $li->edit_time('now');
-        $li->eg_bib_id($record->id);
-        $e->update_acq_lineitem($li) or return $e->die_event;
-    }
-
-    my $li_details = $e->search_acq_lineitem_detail({lineitem => $li_id}, {idlist=>1});
-
-    # -----------------------------------------------------------------
-    # for each lineitem_detail, create the volume if necessary, create 
-    # a copy, and link them all together.
-    # -----------------------------------------------------------------
-    my %volcache;
-    for my $li_detail_id (@{$li_details}) {
-
-        my $li_detail = $e->retrieve_acq_lineitem_detail($li_detail_id)
-            or return $e->die_event;
-
-        my $volume = $volcache{$li_detail->cn_label};
-        unless($volume and $volume->owning_lib == $li_detail->owning_lib) {
-            my $vol_id = $U->simplereq(
-                'open-ils.cat',
-                'open-ils.cat.call_number.find_or_create',
-                $auth, $li_detail->cn_label, $li->eg_bib_id, $li_detail->owning_lib);
-            $volume = $e->retrieve_asset_call_number($vol_id) or return $e->die_event;
-            $volcache{$vol_id} = $volume;
-        }
-
-        if($U->event_code($volume)) {
-            $e->rollback;
-            return $volume;
-        }
-
-        my $copy = Fieldmapper::asset::copy->new;
-        $copy->isnew(1);
-        $copy->loan_duration(2);
-        $copy->fine_level(2);
-        $copy->status(OILS_COPY_STATUS_ON_ORDER);
-        $copy->barcode($li_detail->barcode);
-        $copy->location($li_detail->location);
-        $copy->call_number($volume->id);
-        $copy->circ_lib($volume->owning_lib);
-
-        my $stat = $U->simplereq(
-            'open-ils.cat',
-            'open-ils.cat.asset.copy.fleshed.batch.update', $auth, [$copy]);
-
-        if($U->event_code($stat)) {
-            $e->rollback;
-            return $stat;
-        }
-
-        my $new_copy = $e->search_asset_copy({deleted=>'f', barcode=>$copy->barcode})->[0]
-            or return $e->die_event;
-
-        $li_detail->eg_copy_id($new_copy->id);
-        $e->update_acq_lineitem_detail($li_detail) or return $e->die_event;
-    }
-
-    return 1;
-}
-
-
-
-__PACKAGE__->register_method(
 	method => 'retrieve_lineitem',
 	api_name	=> 'open-ils.acq.lineitem.retrieve',
 	signature => {
@@ -352,7 +195,15 @@
     my($self, $conn, $auth, $li) = @_;
     my $e = new_editor(xact=>1, authtoken=>$auth);
     return $e->die_event unless $e->checkauth;
+    my $evt = update_lineitem_impl($e, $li);
+    return $evt if $evt;
+    $e->commit;
+    return 1;
+}
 
+sub update_lineitem_impl {
+    my($e, $li) = @_;
+
     my $orig_li = $e->retrieve_acq_lineitem([
         $li->id,
         {   flesh => 1, # grab the lineitem with picklist attached
@@ -367,8 +218,7 @@
     $li->editor($e->requestor->id);
     $li->edit_time('now');
     $e->update_acq_lineitem($li) or return $e->die_event;
-    $e->commit;
-    return 1;
+    return undef;
 }
 
 __PACKAGE__->register_method(



More information about the open-ils-commits mailing list